静态存储区,栈 堆 的区别?为什么我的程序不报错?

leo_darwins 2010-08-15 03:42:16
http://www.360doc.com/content/10/0807/12/2597709_44296354.shtml
看到网络上转载了很多 “静态存储区,栈 堆 的区别?”的文章,见上。
我在VC6.0上试验了一把,发现程序没有报错?奇怪了,为什么不报错呢?

// Testaaa.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


char *f1()
{
char* p = NULL;
char a;
p = &a;
return p;
}

int main(int argc, char* argv[])
{


char *p = NULL;
p = f1();
*p='d';
return 0;
}


文章说a是的存储空间是临时的,使用f1()后,系统会自动删除,而*p='d'将会报错,因为没有了这段空间而操作这段空间,所以会报错。但是我的程序没有报错,为什么会这样?请教大虾们。
c++ 新手,提出的问题比较基础...
...全文
89 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaowenboms 2010-08-15
  • 打赏
  • 举报
回复
静态存储区:是存储常量一类的在编译时都已分配好的内存的数据;
栈:是函数内的临时变量存储的地方,是执行程序执行到函数时分配的;
堆:是程序员分配的内存,你用new, malloc分配的内存;
明白了吗
大昊 2010-08-15
  • 打赏
  • 举报
回复
因为中间有一些程序优化的东西,具体的不好说,不过你在调用此函数后再调用个其他函数就可以将a覆盖,但具体覆盖成什么不可控,不知道你会不会汇编,你可以反汇编看一下就知道了
leo_darwins 2010-08-15
  • 打赏
  • 举报
回复
你的意思是说,只要a的内存没有被使用,p还是指向a的地址吗?
如果这样的话,只要我修改了a的内存,p就成了野指针了,从而p就不可以使用了。。。是吗?
如何修改程序,从而使a内存改变,以致p就不能使用了?
多谢
大昊 2010-08-15
  • 打赏
  • 举报
回复
这是不一定会报错的,char a是在栈上分配的,当函数返回时栈的内存是被释放,但并没有被置0,也就是说p虽然是野指针(不受保护),但它实际上指向的还是原来a的位置,只要在这期间原来保存a的那块内存不被使用就不会修改,也就是说和正常一样。

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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