c - 测试单链表性能时出现AddressSanitizer错误

标签 c linked-list stack-overflow singly-linked-list address-sanitizer

我正在创建一个单向链表。为了创建它,我编写了诸如 struct node 之类的结构和诸如 list_free_node 之类的操作。现在这是我第一次使用 mallocpointers,我遇到了一些以前从未见过的错误(我认为与提到的这两个概念有关)。

我编写的代码在我自己测试时似乎有效,我 uploaded它用于测试目的,它可以编译并在浏览器中在线运行。

但是,当我使用make check 时,check_list.c 会自动检查它.发生这种情况时,我会遇到以前从未见过的错误。

Errors about Deadlysignal .

我搜索了那些错误,发现它与堆栈溢出有关。我认为错误可能是我使用了一个不存在的指针或其他东西。但是,当我手动运行我的代码时,它似乎工作得很好。我不明白这是怎么发生的。

如有任何建议,我们将不胜感激。

最佳答案

至少有这些错误:

  • list_add_front()

                if (l -> head == NULL) {
                        l -> head = n;
                        return 0;
    

    在这里你忘了n->next尚未初始化;相当于 n->next = NULL 的东西不见了。当然你可以合并类似的 ifelse body 和单独写

                n -> next = l -> head;
                l -> head = n;
                return 0;
    
  • list_add_back()

    在这里你也忘记了n->next尚未初始化并且 n->next = NULL不见了。

    或者你可以设置n->next = NULLlist_new_node() .

  • list_cleanup()

                currentnode = nextnode;
                list_free_node(currentnode);
                nextnode = list_next(nextnode);
    

    我们不能在节点被释放后使用节点内容,因此我们不能调用list_next() (这需要节点的 ->next 指针)在 list_free_node() 之后.只需交换最后两行即可。

关于c - 测试单链表性能时出现AddressSanitizer错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54733773/

相关文章:

objective-c - Objective-C 中的重复 NSString

c - C中循环链表的显示函数

c++ - c2678 二进制 '==' 未找到采用左手操作数类型的运算符

java - 如何在 Java Spring MVC 创建时将大量数据作为文件提供?

c# - APPCRASH StackOverflowException clr.dll c00000fd

c - 在 C 中从命令行参数打印子字符串

c - TCP服务器停止连接

c - 知道 "inode number"后如何获取inode结构

java - 迭代地反转单向链表

c - C 中的哪个标准库函数将零字节复制到堆栈?