1. ホーム
  2. c

[解決済み] valgrind アドレス 0x421688c は、整数データを持つリンクリスト用に割り当てられたサイズ 4 のブロックの後で 0 バイトです。

2022-02-16 05:27:40

質問

に関連するスレッドが複数ありましたが

valgrind アドレス 0x421688c は、サイズ 4 のブロックが割り当てられた後、0 バイトになります。

という質問ですが、どれもstrlenや'nothing'関連の問題で表現されており、理解することができました。私は整数を扱うリンクリストの挿入で困っています。

void insert_node(lnode **head, int num){
    lnode *temp = NULL;

    temp = calloc(1, sizeof(lnode *));
    if(temp == NULL){
        printf("Memory Allocation failed!\n");
        return;
    }   
    temp->data = num;
    temp->next = NULL;

    if(*head == NULL){
        *head = temp;
    }   
    else{
        temp->next = *head;
        *head = temp;
    }   
}

挿入、削除のステップを行い、サマリー(valgrindのエラーの最後の数行が同じ場所にあるのでそれを表示)を取得しました。

    > ==3238== 9 errors in context 5 of 5:
    > ==3238== Invalid read of size 4
    > ==3238==    at 0x804873D: display (in /home/skb/santosh_practice/linked_list_progs/single_LL/a.out)
    > ==3238==    by 0x8048636: main (in /home/skb/santosh_practice/linked_list_progs/single_LL/a.out)
    > ==3238==  Address 0x42168fc is 0 bytes after a block of size 4 alloc'd
    > ==3238==    at 0x402C17C: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
    > ==3238==    by 0x8048686: insert_node (in /home/skb/santosh_practice/linked_list_progs/single_LL/a.out)
    > ==3238==    by 0x8048614: main (in /home/skb/santosh_practice/linked_list_progs/single_LL/a.out)
    > ==3238== 
    > ==3238== ERROR
ERROR SUMMARY: 22 errors from 5 contexts (suppressed: 0 from 0)

どこが間違っているのか教えてください。

解決するには?

問題は、割り当てたサイズにあります。

lnode *temp = NULL;

temp = calloc(1, sizeof(lnode *));

でなければなりません。

lnode *temp = NULL;

temp = calloc(1, sizeof(lnode));

構造体が18オクテット、ポインタが8オクテットの場合、最初のコードでは、18オクテットではなく8オクテットを確保することになり、不十分です。

間違った型を持たないようにする良い方法は、次のようにすることです。

lnode *temp = NULL;

temp = calloc(1, sizeof(*temp));

なぜなら "temp" は "lnode *" の型であり、"*temp" は "lnode" の型であるためです。