c - 当尝试传递结构节点*然后使用 printf 打印时,我不断收到段错误

标签 c linked-list segmentation-fault nodes

完整代码: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);

那么可以肯定的是,kvkv->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));
}

这展示了如何编写调试语句,以便在核心转储停止输出之前刷新它们。

基本上,您需要做的就是逐渐缩小问题范围,直到可以将其隔离到特定行,然后找出该行出了什么问题:-)

<小时/>

顺便说一句,如果一个空列表由设置为 NULLhead 组成,那么 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/

相关文章:

java - 我们需要链表中的前一个元素吗?

c - 奇怪的 "half to even"不同语言的舍入

c - 如何一次性访问数组的多个元素?

java - 即使从递归返回后,LinkedList 仍保留值

C - 分配指向特定位置的指针

c - 为什么优化器会修复我的程序?

java - Android Libgdx - 真实设备上出现 Sigsegv 11 错误,但模拟器上没有崩溃

c - 为什么这个 JNI 只在 Windows 上调用段错误?

c++ - 使 GCC 的 ASM 标签可用于标记化

c - 在 c 中使用 sscanf 的正则表达式忽略空格