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

标签 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
    }
}

最佳答案

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

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

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

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

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

...更改为:

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

从好的方面来说,当你受够了这些,你就会养成对你的指示非常小心的习惯。 ;-)))

关于C变量在传递给函数后被设置为0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6612891/

相关文章:

c++ - CMake 无法使用 C++ 确定链接器语言

c - 杀死 bash 和子进程

c - 为什么2个输出不同?

javascript - 将字符串传递给 JavaScript 函数导致未定义

c++ - 随机填充二维数组

c - C语言中如何遍历二维数组对角线?

c++ - 为什么按值传递 string_view?为什么 Visual Studio 不能对此进行优化?

C++ 如何使用从一个函数到另一个函数的变量?

java - 如何使用可变参数将任意数量的相同类型参数传递给方法?

java - 通过 View.OnClickListener() 传递 MainActivity 的对象