strcmp中的segfault - 可能会从struct传递指针

时间:2012-11-17 19:18:16

标签: c

我试图将用户输入的搜索词与链表中的多个名称进行比较。我肯定知道它是strcmp的segfaulting,但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是我的segfaulting,它肯定是。提前感谢任何建议:)

2 个答案:

答案 0 :(得分:6)

在第

srchbuff[i] = '\0';

你写了超出srchbuff结尾的一个字节。

内存srch指向的内存未初始化。所以任何事情都可能发生。

cur也未初始化。这意味着cur点在任何地方,cur->name也是如此。

答案 1 :(得分:1)

除了在srch中使用未初始化的内存外,您没有条件在列表末尾停止循环。您应该将其修改为以下内容:

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

否则在列表的末尾,cur将变为NULL,并且在下一次迭代时cur->name将出现空指针解除引用。