首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

这么写是不是很危险

2012-11-08 
这样写是不是很危险?C/C++ codestruct Node {int x,y}Node *pvoid function() {Node tt.x 1, t.y

这样写是不是很危险?

C/C++ code
struct Node {  int x,y;};Node *p;void function() {  Node t;  t.x = 1, t.y = 2;  p = &t;}int main() {  function()  printf("%d %d\n", p->x, p->y);  return 0;}

function() 调用完之后, Node t 不是应该被释放掉吗???
为什么printf 还能正确输出??
或者是说Node t 释放了, 但p还是指向Node t本已释放的内存, 强制读取值,这样会有很危险吧??


[解决办法]
你可以这样试试
[code=C/C++]
int main() {
function();
for(int i=0;i <10;i++){
int temp;
printf( "%d %d\n ", p-> x, p-> y);
}
return 0;
}
[/code]
[解决办法]
应该说,就这个写法本身来说,不叫危险。
程序执行到这里时,不会crash,因为p毕竟指向的是一个合法的可读写地址(只是已经被系统释放了),读它是不会引起崩溃的。
为什么还能输出,因为程序小,没有程序别的部分再去分配它改写它的内容。如果程序大了,则可能那块内存被分配并修改了,这个printf可能输出乱七八糟的数,但仍然不会崩溃。
=====================================
类似的写法,危险在哪里呢?对p->x赋值才有可能危险。但这仍然不是它本身危险——“p毕竟指向的是一个合法的可读写地址”,对它的赋值操作本身是不会引起崩溃的。但可能引起的是改变了别处有用的值,导致使用别处内存时逻辑不对而崩溃。例如刚好改到了后面某个malloc所保留的管理块,那么在对应free处崩溃。

为什么不要这么写,因为这类问题极难调试。报告free崩溃了,问题是看malloc free本身是没问题的。要调试非常难,好在现在有数据断点功能,可以把malloc时那个地址记录下来,看看哪里(错误的)改了那块地址附近的内容。
[解决办法]
给你举个例子。
你在旅店住宿,你退房以后发现你把你东西落到旅店原来你住的房间里了。
你私自跑到那个房间去拿你的东西,旅店和客人都不知道。
在这种情况下你被抓到了,会是什么结果。

热点排行