首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C变量在传递给函数后设置为0

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

Stack Overflow用户
提问于 2011-07-07 23:13:53
回答 3查看 158关注 0票数 1

所以我遇到了一个奇怪的问题。我有一个指向结构的指针,并且我正在将它传递给一个函数。一旦进入该函数,我感兴趣的变量之一似乎是0,但在将结构传递给函数之前,我会检查以确保特定变量不是0。奇怪的是,这并不是每次都会发生,只是偶尔发生一次。以前有没有人见过这样的事情?

源代码:

代码语言:javascript
复制
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
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-18 22:23:33

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

票数 0
EN

Stack Overflow用户

发布于 2011-07-07 23:24:48

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

您的症状匹配:间歇性,内存覆盖当它看起来应该没有内存覆盖。

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

有一件事可以帮助你追踪到它,那就是在实例化时显式地将所有指针初始化为"null“。这通常不是必需的,但对调试很有帮助,因为indirection-on-null通常会使您的程序当场崩溃(这正是您想要的),而不是在您访问不属于您的内存时仍然是一个“隐藏问题”(因为C中的指针在默认情况下不会初始化为null)。所以,举个例子:

代码语言:javascript
复制
int* p;   // Initialized to "garbage" memory address

...change至:

代码语言:javascript
复制
int* p = NULL;  // Force initialization for debugging, crashes on indirection

好的一面是,当你承受了足够的痛苦时,你的习惯会让你非常小心地使用指针。;-))

票数 1
EN

Stack Overflow用户

发布于 2011-07-08 03:31:29

脑海中浮现出三种可能性。

来自另一个task.

  • Uninitialized pointer

  • Dangling指针的
  1. 损坏

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6612891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档