C语言 关于内存 栈

[复制链接]
查看11 | 回复5 | 2013-10-8 00:31:22 | 显示全部楼层 |阅读模式
一次不出问题不代表永远不出问题,这次没什么异常仅仅说明那块内存还没被再次修改而已。你可以试试在Debug模式下编译运行下面这一小段代码(release模式下还真不好碰到立即改写被释放空间的情况,Debug模式为了得到足够多的调试信息会有很大几率立即重写被释放的空间)#includeint* f(){ int a=1; return &a;}intmain(){ int* p=f();printf("%d\n",*p);//printf结束后会有很大几率改写自由栈空间printf("%d\n",*p);//再来一次大概就不对了 return 0;}记住:不要返回一个局部非静态栈对象的地址,这是C/C++语言的一条...
回复

使用道具 举报

千问 | 2013-10-8 00:31:22 | 显示全部楼层
基本正确,确切的说法是:1)调用一个函数时,调用返回地址被推入栈中,返回地址是紧跟在被调用函数后语句的指令地址;2)在函数内声明的非static变量定义在栈中,称为局部变量且在函数内部可以任意操纵(读写);3)在函数内部可以取得变量的地址,也就是指针;4)函数调用返回时清理栈。所有局部变量都被释放;...
回复

使用道具 举报

千问 | 2013-10-8 00:31:22 | 显示全部楼层
你将指向函数中的局部变量的指针返回后,由于该变量在函数执行后被释放,这个变量的地址有可能被别的函数调用分配给调用函数来使用,这时你操作这个变量时,你和函数都在使用这个地址的数据,会相互影响的。原因就是,栈(或者堆)空间被释放了之后你还要强行使用它,导致使用上不安全,有隐患,但不一定肯定影响整个程序运行(比如恰巧这块空间没有其他函数申请使用时,你就可以随便...
回复

使用道具 举报

千问 | 2013-10-8 00:31:22 | 显示全部楼层
第一段是对的。第二段:那如果我在方法中定义一个局部变量,然后将这个局部变量的地址作为指针返回,然后又在其它地方继续操纵这个地址,会如何?一般来说,在方法中定义的变量,退出方法之后系统会自动释放,所以外部看不见,即使是一个指针作为参数传进来,在方法内部申请空间,当退出方法后,这个传入的指针仍然变成了野指针(既不是NULL,又没指向特定空间,而是随机乱指...
回复

使用道具 举报

千问 | 2013-10-8 00:31:22 | 显示全部楼层
如果有返回,栈不会释放这个局部变量,会在调用函数执行完成后才会释放掉变量。...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行