所以我遇到了一个奇怪的问题。我有一个指向结构的指针,我将它传递给一个函数。一旦进入该函数,我感兴趣的变量之一似乎是0,但在将结构传递给函数之前,我检查以确保特定变量不是0.奇怪的是这不会每次都发生,只有偶尔。有没有人见过这样的事情发生过?
源代码:
if( expand->num == 0)
return status;
status = decode( expand );
...
Status_type decode ( expand_type * expand )
{
if(expand->cur_num >= expand->num) // Here is where my error occurs
// 'num' is 0.
{
// Do stuff
}
}
答案 0 :(得分:1)
听起来像是一个“悬空指针”问题:你有一个指向不属于它的内存的流氓指针(例如,不是指针引用的类型的已分配实例),以及程序指示指针的某个地方使用该“值”,指针现在覆盖该值(意外地在您正在检查的值上)。
您的症状匹配:当出现间歇性内存时,应该没有内存覆盖。
追踪可能会非常痛苦,因为您需要检查所有指针操作的完整性,甚至是那些与您当前正在查看的代码无关的操作(监控) )。
帮助您跟踪它的一件事是在实例化时显式初始化所有指针“null”。这通常不是必需的,但可以帮助调试,因为indirection-on-null通常会使程序正确地崩溃(这是你想要的),而不是保持为“隐藏的问题”当您访问不属于您的内存时(因为默认情况下C中的指针未初始化为null)。所以,例如:
int* p; // Initialized to "garbage" memory address
...改为:
int* p = NULL; // Force initialization for debugging, crashes on indirection
从好的方面来说,当你遭受足够的痛苦时,你的习惯会使你的指针非常小心。 ; - )))
答案 1 :(得分:0)
有三种可能性浮现在脑海中。
在这三种可能性中,我的钱(基于当前信息)是未初始化的指针。
我的猜测是未初始化指针的值在堆栈中的位置足够远,当调用decode()时,存储'expand-> num'的内存会被复制参数'expand'破坏进入堆栈,或将返回地址复制到堆栈,或者通过设置stack()的堆栈帧。
答案 2 :(得分:0)