在我的C程序中,在调用函数之后,外部函数中的所有变量都消失了。程序不再识别它们存在,并且尝试访问它们会导致错误。
void outer_function()
{
int x = 0;
inner_function();
printf("%d\n", x); // Throws an error because x does not exist
}
我不确定inner_function()中是什么导致它,并且函数太长而无法在此处粘贴。什么样的行为可能导致outer_function()
中的局部变量消失?我唯一能想到的是inner_function()
正在写outer_function()
的内存,但似乎这只会改变变量的内容,而不是删除它们。
编辑:我不认为我能告诉你真的还有很多。 gcc说EXC_BAD_ACCESS然后“警告:无法恢复以前选择的帧”,然后崩溃。我知道你很难说在没有看到整个功能的情况下实际导致它的原因,这就是为什么我最初只是问什么类型的bug会导致这样的行为。
答案 0 :(得分:2)
没有看到完整的,可编辑的代码片段,就不可能说了。我唯一能想到的是inner_function()
实际上是一些不正常的宏,它会搞砸了。
答案 1 :(得分:2)
您是否100%确定printf("%d\n", x);
是导致错误的行?你介入过这个吗?我会在inner_function()
之前,期间和之后添加一些行来打印x的输出,以准确查看问题所在。我觉得你在inner_function()
内有问题。
答案 2 :(得分:2)
一旦你进入未定义行为的领域,所有的赌注都会被关闭,所以如果inner_function()
内部存在任何未定义的行为,整个程序的后续行为以及outer_function()
的后续行为也是未定义的。< / p>
答案 3 :(得分:1)
也许您以不同的方式声明和定义inner_function(cdecl和stdcall)。
答案 4 :(得分:1)
虽然您仍然应该返回并编辑您的问题以添加一些有关程序失败的信息以及“正在删除的局部变量”实际意味着什么,这可能会导致程序丢失值来自不同范围的变量。
void inner_function(void) {
int x[1];
memset(x, 0, 10 * sizeof(x));
}
当函数尝试返回时,这实际上应该失败。这称为缓冲区溢出,因为您有一个缓冲区(用于存放某些内容的一系列内存),您有权使用(来自C编程语言)进行编辑,但您可以编辑它以及更多内容。 “更多”数据是编译器期望您不会编辑的其他内存,如返回地址和其他范围中的变量。
这个例子是一个非常普遍的例子,它很容易被理解,但很可能如果你的inner_function确实遭受了这种类型的错误,那么它就不会那么清楚了。也可以使缓冲区溢出不会覆盖返回值,这样inner_function就会返回而不会失败,但是你可能会发现outer_function中的局部变量发生了变化(我认为你在代码中发生了这种情况)但是为了有目的地编写一个可用的例子我需要更多地了解你正在使用的平台,编译器和编译器选项,以便我可以对堆栈中的位置做出有根据的猜测,相对于顶层事情可能就是堆栈(这是当前函数的堆栈框架)。