1

そのため、私が取り組んでいるプロジェクトでは、次のエラーが発生します。

*** glibc detected *** ./social_network: munmap_chunk(): invalid pointer: 0x09a913b0 ***

いくつかの printf ステートメントで、このエラーの原因となる解放しようとしている構造体のメモリ アドレスが ....17 であることが明らかになりました。では、これはどのように可能ですか?これが現れるには何が起こったのでしょうか...?

クラッシュ直前の出力は次のとおりです。

temp is: 162075592
temp user is  162075408
After free of temp
inside while loop, first line
before free of temp
temp is: 162075760
temp user is  162075480
After free of temp
inside while loop, first line
before free of temp
temp is: 162075568
temp user is  17

そして、これが出力を出力するコードです

 21 void destroy() {
 22 
 23     struct user_node *node;
 24 
 25     struct friend_node *temp;
 26     struct friend_node *next_temp;
 27     
 28     //iterate over the list of users
 29     while (*head != NULL) {
 30         printf("before a_friend\n");
 31         temp = (*head)->a_friend;
 32         
 33         //Iterate over friends of users, free friend nodes
 34         while (temp != NULL) {
 35             printf("inside while loop, first line\n");
 36             next_temp = temp->next_friend;
 37             printf("before free of temp\n");
 38             printf("temp is: %d\n", (int) temp);
 39             printf("temp user is  %d\n", (int)temp->user);
 40             free(temp); <==================================SEGFAULT IS HERE!!!!!!!!!!!!!
 41             printf("After free of temp\n");
 42             temp = next_temp;
 43             next_temp = NULL;
 44         }
 45 
 46         node = (*head)->next_user;
 47         printf("before free of: %s\n", (*head)->name);
 48         free(*head);
 49         printf("after free of that person...\n");
 50         *head = node;
 51         printf("*head = node afterwards\n");
 52         node = NULL;
 53     }
 54     printf("before final free...\n");
 55     free(head);
 56 }

編集:

struct_friend_node

 23 //node used to store a pointer to a user_node and next friend
 24 struct friend_node {
 25     struct friend_node *next_friend;
 26     struct user_node *user;
 27 }; 

構造体 user_node

 12 //Struct definitions
 13 //node used to store information about a user
 14 struct user_node {
 15     char name[21];
 16     int age;
 17     int gender;
 18     char location[21];
 19     struct friend_node *a_friend;
 20     struct user_node *next_user;
 21 };
 22    
4

4 に答える 4

7

これは通常、NULLポインターを使用しているときに発生します。構造体のメンバーにアクセスすると、そのオフセットがポインターに追加され、逆参照されます。

somestruct *p = NULL;
printf("%d", p->member);

メンバーがオフセット(たとえば0xC)にある場合、「0x0でメモリにアクセスしようとしています」のようなエラーは表示されませんが、「0xCでメモリにアクセスしようとしています」などのエラーは表示されません。

編集:他の人が示唆したように、これはおそらくあなたの問題の原因ではありません。ただし、「2桁のポインタ」でエラーが発生する一般的な理由の1つです。

于 2012-11-16T15:19:32.957 に答える
2

これを表示するために何が起こった可能性がありますか

多くの種類の未定義の動作があります。バッファ オーバーラン、割り当て解除されたオブジェクトへのアクセス、初期化されていない変数のすべてが思い浮かびます。

これらのものを追い詰めることで、valgrindあなたの親友です。早い段階で頻繁に使用してください。

于 2012-11-16T15:23:02.413 に答える
2

17あなたが間違って信じているように、アドレスで構造体を解放していることを示唆するコードは何も見当たりません。

クラッシュ メッセージとダンプの両方が、tempアドレス162075568( 0x09a913b0) を指すポインターを解放しようとしていることを明確に示しています。そのポインターは無効なメモリを指しているため、freeクラッシュします。17これが、そのメモリ内に格納されていることがわかる理由でもあります。そのメモリは無効なので、ランダムなガベージが格納されていても驚くことはありません。

そんなことは忘れてください17。それは何の関係もありません。あなたの問題は162075568( 0x09a913b0) です。この値は無効であり、それが問題の原因です。

于 2012-11-16T15:26:08.000 に答える
0

の作成/割り当てのポインタであるすべてのstructメンバーを初期化するようにしてください。NULLstruct

于 2012-11-16T15:20:36.130 に答える