【问题标题】:C variable being set to 0 after passing to function传递给函数后 C 变量设置为 0
【发布时间】:2011-07-07 15:13:53
【问题描述】:

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

【问题讨论】:

  • 把出现问题的源代码贴出来,不然我们很难帮忙
  • 提高编译器的警告级别并注意警告
  • expand指向的结构是静态分配的还是动态分配的?如果是后者,你检查malloc调用是否成功?
  • 您是重新输入此代码,还是复制粘贴?如果你重新输入,if 中有==,还是=

标签: c parameter-passing


【解决方案1】:

听起来像一个“悬空指针”问题:你有一个流氓指针指向不属于它的内存(例如,不是指针引用的类型的已分配实例),并且程序在某处指示指针使用该“值”,并且指针现在正在覆盖该值(这不小心在您正在检查的值上)。

您的症状匹配:间歇性,出现内存覆盖时应该没有内存覆盖。

追踪这些可能非常痛苦,因为您需要检查指针操作的所有的完整性,即使是那些与您当前正在查看的代码无关的操作(监控)。

帮助您追踪它的一件事是在实例化时显式初始化所有指向“null”的指针。这通常不是必需的,但对调试很有帮助,因为间接空值通常会使您的程序崩溃就在那里(这是您想要的),而不是作为“隐藏的问题”当您访问不属于您的内存时(因为 C 中的指针默认情况下未初始化为 null)。所以,例如:

int* p;   // Initialized to "garbage" memory address

...更改为:

int* p = NULL;  // Force initialization for debugging, crashes on indirection

从好的方面来说,当你受够了这些痛苦时,你的习惯会让你对指针非常小心。 ;-)))

【讨论】:

  • 虽然对于 C 我会说 NULL 而不是 0 的使用更常见(即使没有必要 afaik)。
【解决方案2】:

想到了三种可能性。

  1. 另一个任务的损坏。
  2. 未初始化的指针
  3. 悬空指针

在这三种可能性中,我的钱(基于当前信息)是未初始化的指针。

我的猜测是,未初始化指针所指向的值刚好在堆栈下方足够远,以至于当调用 decode() 时,存储“expand->num”的内存被复制参数“expand”损坏栈,或者将返回地址复制到栈中,或者通过为decode()设置栈帧。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      • 2015-10-22
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多