所以我遇到了一个奇怪的问题。我有一个指向结构的指针,并且我正在将它传递给一个函数。一旦进入该函数,我感兴趣的变量之一似乎是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
}
}发布于 2011-07-18 22:23:33
终于找到了问题所在。有多个线程,并且两个线程试图同时访问同一个变量(扩展变量),导致它被覆盖!因此,我不得不在某个点上停止其中一个线程,这样两个线程就不会访问相同的东西。
发布于 2011-07-07 23:24:48
听起来像是“悬空指针”问题:你有一个流氓指针指向不属于它的内存(例如,不是该指针引用的类型的已分配实例),并且在某个地方程序指示该指针使用该“值”,并且该指针现在正在覆盖该值(该值意外地位于您正在检查的值上)。
您的症状匹配:间歇性,内存覆盖当它看起来应该没有内存覆盖。
跟踪这些操作可能非常痛苦,因为您需要检查所有指针操作的完整性,即使是那些与您当前正在查看(监视)的代码无关的操作。
有一件事可以帮助你追踪到它,那就是在实例化时显式地将所有指针初始化为"null“。这通常不是必需的,但对调试很有帮助,因为indirection-on-null通常会使您的程序当场崩溃(这正是您想要的),而不是在您访问不属于您的内存时仍然是一个“隐藏问题”(因为C中的指针在默认情况下不会初始化为null)。所以,举个例子:
int* p; // Initialized to "garbage" memory address...change至:
int* p = NULL; // Force initialization for debugging, crashes on indirection好的一面是,当你承受了足够的痛苦时,你的习惯会让你非常小心地使用指针。;-))
发布于 2011-07-08 03:31:29
脑海中浮现出三种可能性。
来自另一个task.
在这三种可能性中,我的钱(基于当前信息)是未初始化指针的钱。
我的猜测是,未初始化指针的值在堆栈中指向了足够远的地方,以至于当调用decode()时,存储'expand->num‘的内存被复制到堆栈上或将返回地址复制到堆栈中,或者通过为decode()设置堆栈帧而损坏。
https://stackoverflow.com/questions/6612891
复制相似问题