C语言中自动变量在其作用域之外的使用
我正在研究自动变量的工作原理。我知道它只能在声明它的块或函数内访问,并且它的生存期在同一个函数或块内。下面是我要检查的代码 /头文件的声明/ 输出为-444 我想知道当testfn()时;退出时,变量x将被销毁。然后在主函数中指针(*p)如何打印444。 这是如何工作的…或者如果我遗漏了什么。 请澄清我的疑问C语言中自动变量在其作用域之外的使用,c,C,我正在研究自动变量的工作原理。我知道它只能在声明它的块或函数内访问,并且它的生存期在同一个函数或块内。下面是我要检查的代码 /头文件的声明/ 输出为-444 我想知道当testfn()时;退出时,变量x将被销毁。然后在主函数中指针(*p)如何打印444。 这是如何工作的…或者如果我遗漏了什么。 请澄清我的疑问 谢谢之前为变量x保留的内存位置尚未被覆盖。但它可能在任何时候。这就是代码导致未定义行为的原因 在以下示例中,先前为变量x保留的内存位置将被分配给变量y的值覆盖。由于指针p仍然指向该位置,*
谢谢之前为变量
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;
}
#包括
int*p;
无效测试1(无效){
int x=444;
p=&x;
}
void test2(){
int y=15;
}
内部主(空){
test1();
test2();
printf(“%d\n”,*p);
返回0;
}
原来的值仍然保留,这是巧合。如果使用另一个编译器,或者使用另一个编译配置,它可能会接受任何其他值,或者程序可能会崩溃
如果在
testfn
和printf
函数之间调用任何其他对其局部变量执行操作的函数,则可能会发现不再获得444值。但这又是巧合。p
指向存储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;
}
由于代码会导致未定义的行为,如果我在另一个平台上尝试,结果可能会有所不同。但是您可以看到,未定义的行为可能会导致奇怪的bug 值仍然保留的事实完全是巧合(不保证),因为还没有任何内容覆盖它 你不能指望这一点,它可能会失败,可能打印垃圾,甚至可能崩溃你的程序或电脑
不要使用它,它被认为是未定义的行为。未定义的行为……这就是未定义行为的问题:它可能看起来像预期的行为,而实际上它不是。不幸的是,这是一个未定义、未定义的错误行为。地址的值与函数激活时的值相同,但它指向的内存不再分配给该函数。但这完全是浪费时间。我知道你在努力学习,但这不是你应该在这里发布的东西。
#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