当前位置: 技术问答>linux和unix
栈内存回收
来源: 互联网 发布时间:2016-12-04
本文导语: i n t f1(int val) { int *ptr; if (val == 0) { int val; val = 5; ptr = &val; }/////////////2处 return (*ptr + 1); }/////////////////1处 1 4 0 U N I X环境高级编程 大家分析下这个题目 输出 6 是否说明栈空间在方法结束后才回收 在...
i n t f1(int val)
{
int *ptr;
if (val == 0) {
int val;
val = 5;
ptr = &val;
}/////////////2处
return (*ptr + 1);
}/////////////////1处
1 4 0 U N I X环境高级编程
大家分析下这个题目
输出 6 是否说明栈空间在方法结束后才回收 在括号外只是访问权限 消失 使用指针还是能访问到的
栈内存回收到底是一个function结束(1处) 还是括号结束(2处)以在if中的val变量为例
{
int *ptr;
if (val == 0) {
int val;
val = 5;
ptr = &val;
}/////////////2处
return (*ptr + 1);
}/////////////////1处
1 4 0 U N I X环境高级编程
大家分析下这个题目
输出 6 是否说明栈空间在方法结束后才回收 在括号外只是访问权限 消失 使用指针还是能访问到的
栈内存回收到底是一个function结束(1处) 还是括号结束(2处)以在if中的val变量为例
|
这个可能会因编译器而异,具体查看汇编指令了
如下一段代码
#include
main()
{
int a;
printf("a=%pn", &a);
{
int b;
printf("b=%pn", &b);
int c;
printf("c=%pn", &c);
}
int d;
printf("d=%pn", &d);
}
在sun平台的运行结果:
a=ffbffac0
b=ffbffabc
c=ffbffab8
d=ffbffabc
可见,变量d复用了变量b的地址
而同样一段程序在aix平台的运行结果(没事):
a=2ff22590
b=2ff22598
c=2ff2259c
d=2ff22594
在suse linux的运行结果(没事):
a=0x7fff3adc29fc
b=0x7fff3adc29f4
c=0x7fff3adc29f0
d=0x7fff3adc29f8
在HP平台的运行结果(没事):
a=7b040af0
b=7b040af4
c=7b040af8
d=7b040afc
如下一段代码
#include
main()
{
int a;
printf("a=%pn", &a);
{
int b;
printf("b=%pn", &b);
int c;
printf("c=%pn", &c);
}
int d;
printf("d=%pn", &d);
}
在sun平台的运行结果:
a=ffbffac0
b=ffbffabc
c=ffbffab8
d=ffbffabc
可见,变量d复用了变量b的地址
而同样一段程序在aix平台的运行结果(没事):
a=2ff22590
b=2ff22598
c=2ff2259c
d=2ff22594
在suse linux的运行结果(没事):
a=0x7fff3adc29fc
b=0x7fff3adc29f4
c=0x7fff3adc29f0
d=0x7fff3adc29f8
在HP平台的运行结果(没事):
a=7b040af0
b=7b040af4
c=7b040af8
d=7b040afc
|
对啊 回收并不清理数据,只是解除变量跟内存之间的关系
|
这个和编译器有关。所以应用程序不管结果对还是不对都不应该那么用