首页 新闻 会员 周边

关于 栈 内存的问题

0
悬赏园豆:5 [已解决问题] 解决于 2011-11-01 16:16

首先请大家看下面的例子能不能正常输出'e'.

#include<stdio.h>

void test(char**p)

{

  char a = 'e';

   *p = &a;

}

int main(void)

{

  char* p;

   test(&p); 

   printf("%c", *p);

  return 0;

}

 

问题:char a = 'a';应该存放在栈内存上,这块内存应该随着test()函数的结束而释放 , 也就是说&a所指向的那块内存应该被释放了,不再是'a'了,而是垃圾数据。

可事实上,在VS2010上, 以上例子却可以正常运行。

非常费解,查阅有关资料,只说与编译器有关系。还请有关达人细说一下,感激不尽!

影一辉的主页 影一辉 | 菜鸟二级 | 园豆:205
提问于:2011-10-10 15:25
< >
分享
最佳答案
0

请问是哪一本书告诉你'e'分配在栈上面了??

告诉我,顺便把那本书扔掉,越早越好.

'e'分配在数据段,a分配在栈上面.a的内容是'e'.

你的指针p在test里面指向了一个临时变量,这样是不合法的.

标准C里面,访问已经被释放的变量,行为是未定义的.

收获园豆:5
egmkang | 初学一级 |园豆:-734 | 2011-10-24 15:20

没说'e'在栈上!

"你的指针p在test里面指向了一个临时变量,这样是不合法的.

标准C里面,访问已经被释放的变量,行为是未定义的." 这才是我想问的,a在栈上,p指向a, a被释放, 但a的内容还能被通过P访问并打印出来了 。

影一辉 | 园豆:205 (菜鸟二级) | 2011-10-24 15:46

@影一辉: 

能打印出来也属于未定义行为的一种,未定义的意思就是,只有上帝知道那玩意儿出来到底是什么.

egmkang | 园豆:-734 (初学一级) | 2011-10-25 09:24

@egmkang: 上帝说:“你该结贴了!”, 于是我结贴了。。。

影一辉 | 园豆:205 (菜鸟二级) | 2011-11-01 16:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册