关于局部变量的意外输出
Unexpected output regarding local variable
我在函数 foo()
中创建了一个局部变量 b
。这个函数returns变量的地址b
。由于 b
是函数 foo()
的局部变量,变量的地址不应该在函数 foo()
执行完成时存在。我收到以下警告消息:
C:\Users\User\Documents\C codes\fun.c||In function 'foo':
C:\Users\User\Documents\C codes\fun.c|6|warning: function returns address of local variable [-Wreturn-local-addr]|
但是main()
函数的指针ptr
成功接收到b
的地址并打印出来。据我对stack的了解,程序returns对main()
函数的控制后,局部变量b
的地址应该不复存在了。但输出证明并非如此。
#include<stdio.h>
int* foo()
{
int b = 8;
return &b;
}
int main()
{
int *ptr;
ptr = foo();
printf("b = %d", *ptr);
return 0;
}
输出:
b = 8
对象的生命周期 是程序执行期间为其保留存储(内存)的部分。
当我们说一个对象不再存在于 C 模型中时,我们的意思是保留结束。内存不再为对象保留。这只是一个簿记操作;内存可能会或可能不会用于其他目的。保留结束这一事实并不意味着任何强制执行您不得使用内存的规则。
当你在一个对象的内存预留结束后使用它会发生什么,就像你侵入现实世界时会发生什么。也许没有人注意到,而您却侥幸逃脱。也许有人注意到并阻止了你。也许有人改变了那里的东西,也许他们没有。
在您测试的情况下,b
所在的内存没有任何变化,并且您使用了不再为 b
保留的内存。但是你不能依赖这个;没有规则说它永远有效。
我在函数 foo()
中创建了一个局部变量 b
。这个函数returns变量的地址b
。由于 b
是函数 foo()
的局部变量,变量的地址不应该在函数 foo()
执行完成时存在。我收到以下警告消息:
C:\Users\User\Documents\C codes\fun.c||In function 'foo':
C:\Users\User\Documents\C codes\fun.c|6|warning: function returns address of local variable [-Wreturn-local-addr]|
但是main()
函数的指针ptr
成功接收到b
的地址并打印出来。据我对stack的了解,程序returns对main()
函数的控制后,局部变量b
的地址应该不复存在了。但输出证明并非如此。
#include<stdio.h>
int* foo()
{
int b = 8;
return &b;
}
int main()
{
int *ptr;
ptr = foo();
printf("b = %d", *ptr);
return 0;
}
输出:
b = 8
对象的生命周期 是程序执行期间为其保留存储(内存)的部分。
当我们说一个对象不再存在于 C 模型中时,我们的意思是保留结束。内存不再为对象保留。这只是一个簿记操作;内存可能会或可能不会用于其他目的。保留结束这一事实并不意味着任何强制执行您不得使用内存的规则。
当你在一个对象的内存预留结束后使用它会发生什么,就像你侵入现实世界时会发生什么。也许没有人注意到,而您却侥幸逃脱。也许有人注意到并阻止了你。也许有人改变了那里的东西,也许他们没有。
在您测试的情况下,b
所在的内存没有任何变化,并且您使用了不再为 b
保留的内存。但是你不能依赖这个;没有规则说它永远有效。