【发布时间】:2018-09-23 19:31:59
【问题描述】:
我对 C 非常陌生,我不明白代码中出现分段错误的位置。我只是想创建一个链接列表,它将作为哈希表的类型单元。我知道我可能没有在我应该使用的地方使用 malloc。主要功能将运行,但只要我添加一个项目,我就会遇到分段错误。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct word_link
{
char* val;
struct word_link * next;
} word_link;
void add_to_list(char* word, word_link *head);
void add_to_list(char* word, word_link *head){
int i;
word_link * temp = NULL;
word_link * p = NULL;
temp = (word_link*)malloc(sizeof(word_link));
temp->val = word;
temp->next = NULL;
if(head == NULL){
head = temp;
} else {
p = head;
while(p->next != NULL){
p = p->next;
}
p->next = temp;
}
}
void main() {
int i = 0;
struct word_link *lst = malloc(sizeof(word_link));
char* word = "";
while(i == 0){
printf("what to add? ");
scanf("%s",word);
add_to_list(word, lst);
printf("continue? ");
scanf("%d", i);
}
printf("%s", lst->val);
printf("%s", "asdf;kl");
}
【问题讨论】:
-
head = temp;不会更改lst中的main()。另请查看char* word = ""; ... scanf("%s",word);。也许还有其他问题。强烈建议在启用所有警告的情况下进行编译。良好的预期反馈比在 SO 上发布要快。 -
有许多错误强烈表明您不熟悉 C 的内存模型(以及字符串和按值调用参数等)。首先,您可能会发现以下有用:内存调试器(例如,valgrind)、静态代码分析器(例如,clang-check、cppcheck 等)、编译器标志 -Wall -Wextra。尽管如此,他们都不能替代花时间阅读一本关于 C 编程的书。
-
char* word = "";在只读内存中创建一个空字符串的字符串文字。scanf("%s",word);在您尝试写入word(很可能是SegFault)时调用Undefined Behavior 您在哪里为temp->val分配存储空间?您不在 C 中分配字符串,但必须使用strcpy(您可以分配指针,但如果name在main()中发生变化,您将更改val->word- 为 @ 分配存储空间后需要一个副本987654334@. -
不要将调用结果转换为
malloc()(或calloc()或realloc())——这是不必要的,如果你没有正确的原型,它会掩盖一个非常真实的错误范围。
标签: c segmentation-fault