我正在研究自动变量的工作。我知道它只能在声明它的块或函数内部访问,并且它的生命周期在同一个函数或块中。所以我要检查以下代码。
/ 标头文件声明 /
void testfn(void);
int *p;
int main(void)
{
testfn();
print("%d\n",*p);
return 0;
}
void testfn(void)
{
int x=444;
p=&x;
}
输出为 - 444
我想知道当testfn();退出,变量x将被销毁。那么在main函数中指针(* p)如何打印444。 这是如何工作的......或者如果我遗漏了什么。 请澄清我的疑问。
由于
答案 0 :(得分:1)
以前为变量x
保留的内存位置尚未覆盖。但它可能在任何时候。这就是您的代码导致未定义行为的原因。
在以下示例中,先前为变量x
保留的内存位置将被分配给变量y
的值覆盖。由于指针p
仍指向该位置,因此*p
将评估此新值:
#include <stdio.h>
int *p;
void test1(void) {
int x = 444;
p = &x;
}
void test2() {
int y = 15;
}
int main(void) {
test1();
test2();
printf("%d\n",*p);
return 0;
}
答案 1 :(得分:0)
原始价值仍然存在,这是巧合。使用其他编译器或其他编译配置,它可能需要任何其他值,否则程序可能会崩溃。
如果在testfn
和printf
函数之间调用任何其他函数对其局部变量执行某些操作,则可能会看到不再获取444值。但这又是巧合。
答案 2 :(得分:0)
x
指向存储444
的堆栈。如果内存位置尚未用于其他内容,则很可能会获得p
。
尝试在打印#include <stdio.h>
#include <math.h>
void foo() {
int y=123;
}
void testfn(void);
int *p;
int main(void)
{
testfn();
foo();
printf("%d\n",*p);
return 0;
}
void testfn(void)
{
int x=444;
p=&x;
}
之前插入另一个函数调用,看看会发生什么:
123
在我的机器上,输出现在是:
$row
由于代码导致未定义的行为,如果我在另一个平台上尝试此操作,结果可能会有所不同。但是你可以看到未定义的行为可能导致奇怪的错误。
答案 3 :(得分:0)
值仍然存在的事实完全是巧合(不保证),因为还没有覆盖它。
你不能指望它,它可能会失败,可能会打印垃圾或甚至可能导致您的程序或PC崩溃。
不要使用它,它被认为是未定义的行为。