传递给函数后C变量设置为0

时间:2011-07-07 15:13:53

标签: c parameter-passing

所以我遇到了一个奇怪的问题。我有一个指向结构的指针,我将它传递给一个函数。一旦进入该函数,我感兴趣的变量之一似乎是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
    }
}

3 个答案:

答案 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)

有三种可能性浮现在脑海中。

  1. 来自另一项任务的腐败。
  2. 未初始化指针
  3. 悬空指针
  4. 在这三种可能性中,我的钱(基于当前信息)是未初始化的指针。

    我的猜测是未初始化指针的值在堆栈中的位置足够远,当调用decode()时,存储'expand-> num'的内存会被复制参数'expand'破坏进入堆栈,或将返回地址复制到堆栈,或者通过设置stack()的堆栈帧。

答案 2 :(得分:0)

终于找到了问题。有多个线程,两个线程试图同时访问同一个变量(扩展变量),导致它被覆盖!所以我不得不在某一点停止其中一个线程,因此两者都不会访问相同的东西。