函数栈返回的问题,还需要高手给解释一下。

jack_wq 2009-02-16 11:28:37
刚才看了一个帖子,名称:一份C/C++实习生笔试试卷(基础部分),大家讨论一下答案吧!
连接:http://topic.csdn.net/u/20090211/16/773219a4-bb84-4702-8669-28fef466af62.html
对于下面的程序,其中很多人认为函数返回后堆栈返回,所以printf(str)输出结果未知。实际的输出结果确实是乱码,但是我在printf(str)这一行设置了断点(VC环境),结果发现str的内容居然是Welcome to AMOI,既然栈已经返回,那么里面不应该有数据才对(或者说是数据未知才对),为什么数据是已经返回的栈中的变量内容呢?
char* GetMemory(void)
{
char p[] = "Welcome to AMOI";
return p;
}
void main(void)
{
char* str = NULL;
str = GetMemory();
printf(str);
}
运行main函数的结果如何?你觉得该段代码是否存在什么问题?
...全文
110 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxloverm 2011-09-27
  • 打赏
  • 举报
回复
char* GetMemory(void)
{
char p[] = "Welcome to AMOI";
return p;
}
兄弟 这是个指针函数,具有指针的作用。给分吧,
嘿嘿嘿!!!!!!!
jack_wq 2009-02-16
  • 打赏
  • 举报
回复
OK,谢谢楼上各位,终于明白了!
疯哥哥 2009-02-16
  • 打赏
  • 举报
回复
同上,在printf后面设断点看看.
AMOI?夏新的题?
VirGhost 2009-02-16
  • 打赏
  • 举报
回复
胡乱猜一下。
GetMemory()返回时只是修改了栈顶的指针,而没有销毁栈的内容,所以p指向的内容仍然是那个字符串。-_b
waizqfor 2009-02-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 jack_wq 的帖子:]
刚才看了一个帖子,名称:一份C/C++实习生笔试试卷(基础部分),大家讨论一下答案吧!
连接:http://topic.csdn.net/u/20090211/16/773219a4-bb84-4702-8669-28fef466af62.html
对于下面的程序,其中很多人认为函数返回后堆栈返回,所以printf(str)输出结果未知。实际的输出结果确实是乱码,但是我在printf(str)这一行设置了断点(VC环境),结果发现str的内容居然是Welcome to AMOI,既然栈已经返回,那么里面不应该有数据…
[/Quote]
你能看到返回结果是Welcome to AMOI 是因为栈内的东西 没有被其他资源所覆盖 所以能显示 不过输出的时候 编译器会检测的
如果你再次调用函数的时候 那栈内东西就被覆盖了 肯定看到的不是你的结果了
LZ你在代码上加条调用就知道了
逸学堂 2009-02-16
  • 打赏
  • 举报
回复
那是因为str指针指向的栈内容没有被其他栈内容覆盖掉。
这种简单测试得出的结论不可靠。

void main(void)
{
char* str = NULL;
str = GetMemory();
int tet = 1; // 增加几个这样的变量。再测试。
printf(tet);
printf(str);
}

lbh2001 2009-02-16
  • 打赏
  • 举报
回复
如果随后没有其他函数调用,栈中的内容可能没有被覆盖掉
随后有其他函数调用的话,栈中的内容必定被覆盖掉

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧