2

ユーザーが入力した検索語を、リンクリスト内のいくつかの名前と比較しようとしています。strcmpでのsegfaultingであることは確かですが、strcmpでのsegfaultsの解決策はどれも問題ではないようです。

これが私のコードです!私はまだStackOverflow&Cに非常に慣れていないので、これの投稿または実際のプログラミングで私が犯したばかげた間違いについて事前に謝罪します。><

struct node{
char* name;
struct node* next;
};

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(){
char reader;
char srchbuff[1001];
char name[10] = "Justin";
char* srch;
int i;

struct node *head;
struct node *cur;

head = malloc(sizeof(struct node));
head->name = name;
head->next = 0;

for(i=0; i<1000; i++){
   scanf("%c", &reader);
   srchbuff[i] = reader;
}


srchbuff[i] = '\0';
srch = malloc(sizeof(char)*i);
strcpy(srch, srchbuff);

cur = head;

while( (cur != NULL) && (strcmp(cur->name, srch)) != 0){
    cur = cur->next;
}
}

別の関数に割り当てられた他のノードがあり、正常に機能します。また、情報も別の関数に割り当てられ(これも正常に機能します)、構造体はヘッダーファイルにあるため、すべて満足して認識されます。

また、gdbステートメントとprintfステートメントを使用してテストし、strcmpがsegfaultingの場所にあることを確認しましたが、間違いなくそうです。提案を事前に感謝します:)

4

2 に答える 2

6

行で

srchbuff[i] = '\0';

srchbuffの終わりを超えて1バイトを書き込みます。

srchを指すメモリは初期化されていません。だから何かが起こるかもしれません。

curまた、初期化されていません。これはcurどこでもポイントすることを意味し、そうしcur->nameます。

于 2012-11-17T19:22:56.190 に答える
1

で初期化されていないメモリを使用する以外srchに、リストの最後でループを停止する条件はありません。次のように変更する必要があります。

while (cur != NULL && strcmp(cur->name, srch) != 0){
   cur = cur->next;
}

そうしないと、リストの最後で、にcurなり、次の反復NULLでnullポインターの逆参照が発生します。cur->name

于 2012-11-17T19:25:21.387 に答える