完整代码:https://gist.github.com/IamSlightly/5debd2373231a62c0a44665902e9ca7f
不确定为什么会发生这种情况,但它发生在第 43 行,当 printf 尝试访问返回值时。
struct node* kv = Lookup (13);
if (kv)
printf ("%s\n", kv->val_ptr);
struct node* Lookup(int x){
struct node *holder;
holder = head;
while ((holder->key!=x) && (holder->next!=NULL)){
holder = holder->next;
}
if (holder->key==x) {
printf("\nlets try this shit again\n");
return holder;
} else {
printf("\n*** %d is not in the linked_list ***\n", x);
return NULL;
}
}
最佳答案
如果你崩溃了:
printf ("%s\n", kv->val_ptr);
那么可以肯定的是,kv
或 kv->val_ptr
都没有指向“kosher”的东西。
由于您的Lookup
代码似乎排除了返回无效指针(当然假设您没有搞砸链接列表的创建),因此很可能val_ptr
字段尚未正确设置,或者它指向的不是字符串。
最好的办法是使用调试器(如果没有合适的调试器,则使用 printf 行)并在尝试使用值之前检查它们。这将极大地帮助您找出根本原因。
如果您要采用 printf
路线(我更喜欢调试器,但它并不总是一个选项),我会查看如下代码,放在您自己的 之前如果(kv)
行:
if (kv) {
printf ("Starting DEBUG\n");
fflush (stdout); fsync (fileno (stdout));
printf ("kv as pointer is %p\n", kv);
fflush (stdout); fsync (fileno (stdout));
printf ("kv->val_ptr as pointer is %p\n", kv->val_ptr);
fflush (stdout); fsync (fileno (stdout));
printf ("kv->val_ptr as char[10] is %10.10s\n");
fflush (stdout); fsync (fileno (stdout));
printf ("Ending DEBUG\n");
fflush (stdout); fsync (fileno (stdout));
}
这展示了如何编写调试语句,以便在核心转储停止输出之前刷新它们。
基本上,您需要做的就是逐渐缩小问题范围,直到可以将其隔离到特定行,然后找出该行出了什么问题:-)
<小时/>顺便说一句,如果一个空列表由设置为 NULL
的 head
组成,那么 Lookup
代码将会崩溃。这里的情况可能不是这样,因为您已经说过它是实际的 printf
行崩溃的。
更好的应该是这样的:
struct node* Lookup (int x) {
struct node *holder = head;
while (holder != NULL)
if (holder->key == x)
return holder;
return NULL;
}
<小时/>
此外,根据您提供的链接中的代码,您可能需要将函数原型(prototype)添加到头文件中。您拥有诸如 head
之类的结构和变量,但对于使用您的实现的任何代码来说,为其中的函数拥有正确定义的定义是一个好主意。例如,它应该包含类似以下内容:
int Insert(int, char*, int);
对于 Insert
函数,您要调用的其他函数也是如此。
关于c - 当尝试传递结构节点*然后使用 printf 打印时,我不断收到段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39382746/