与 Heisenbug 相反,分段错误仅在调试时出现,但程序运行正常

Opposite of a Heisenbug, segmentation fault that appear ONLY when debugging, but program works fine

我写了一个简单的 C 程序,其中有两个数据结构实现为 ADT,所以我为它们动态分配内存

一切正常,直到我决定在结构中添加一个 int 值,没有任何动态分配,经典的简单静态内存分配,但自从我添加它后我开始出现段错误在一个非常安全的函数中,根本不应该出现段错误。

我考虑过内存分配错误,所以我尝试不释放和重用我正在使用的指针变量,而是使用另一个变量,这样做程序运行良好。 一直以来我都不得不处理这种错误,这让我很生气,我重新启用了我之前所说的免费内容,重新编译并用 valgrind 制作了一个 运行。

令我惊讶的是,绝对没有内存泄漏,没有分段错误,没有任何类型的中断,只是关于 Conditional jump or move depends on uninitialised value(s) 的警告,但这是一个需要的行为 (if (pointer == NULL) { }) 所以我直接从命令行 运行 可执行文件,一切正常,所以情况是这样的:

程序在结构中没有新的 int 值:

在结构中使用新的 int 值编程:

所以我认为这与 Heisenbug 相反,Heisenbug 是一个只在调试时出现的错误,我该如何解决这个问题?

好的,感谢@weather-vane 和@some-programmer-dude 我注意到实际上我没有初始化 valgrind 抱怨的变量,我误解了 valgrind 警告,我正在阅读它作为 You should not use a if to check if variables are NULL