2

我正在尝试将用户输入的搜索词与链接列表中的多个名称进行比较。我确定它在 strcmp 处存在段错误,但 strcmp 处的段错误的解决方案似乎都不是问题。

这是我的代码!我对 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 是我要进行段错误的地方,而且肯定是。在此先感谢您的任何建议 :)

4

2 回答 2

6

在行

srchbuff[i] = '\0';

您在 srchbuff 末尾写入一个字节。

内存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并且空指针取消引用将cur->name在下一次迭代中发生。

于 2012-11-17T19:25:21.387 回答