返回指向局部变量的指针很安全哪

weiweishuo 2012-06-30 01:29:19
下面一段程序:
int main(void){
int *j=getPInt();
pad();
pad();
pad();
pad();
pad();
printf("j points to a local location,it is%d",*j);//输出100;
}

void pad(void){
int a=0;
}

int *getPInt(void){
int i=100;
return &i;
}
我以为不会输出是100,因为getPInt函数返回,它的局部变量i那块儿内存也就被弹出栈空间。
我在pad函数里定义变量,想继续堆栈把那块儿“100”的内存给覆盖掉。
为什么还会是100呢?
我只是想验证返回指向局部变量的指针不保险,可发现它很安全那!
小弟新手,言辞愚蠢之处还请指教。-.-
...全文
98 点赞 收藏 10
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
weiweishuo 2012-07-01
[Quote=引用 2 楼 的回复:]

我的输出的是0.楼主换个编译器试试,你只是运气好而已,同楼上

akaedu@akaedu:~/write$ gcc 1.c
1.c: In function ‘getPInt’:
1.c:11: warning: function returns address of local variable
akaedu@akaedu:~/write$ ./a.out
j points ……
[/Quote]用的就是gcc啊,不过你试出来为0,那暂且放心了!
回复
N0bug 2012-06-30
[Quote=引用楼主 的回复:]
下面一段程序:
int main(void){
int *j=getPInt();
pad();
pad();
pad();
pad();
pad();
printf("j points to a local location,it is%d",*j);//输出100;
}

void pad(void){
int a=0;
}


in……
[/Quote]
你觉得安全就用呗 谁关心你这个啊
回复
AnYidan 2012-06-30
[Quote=引用 1 楼 的回复:]
结果是未定义的。

这次是楼主运气好,下次就未必了。
[/Quote]

运气好? 运气不好!

一个正确的程序应该是可无限重复的
回复
老王爱上猫 2012-06-30
我也纳闷这问题,我跟楼主一样,虽然知道是错的
回复
竞天问 2012-06-30
你的代码在使用函数之前都不需要声明的?

我用VC2010试了一下,得到结果 0
回复
竞天问 2012-06-30
[Quote=引用 4 楼 的回复:]

呵呵,你很幸运,恰巧你返回的地址100是你想要得到的数值。但是其实你返回的是i的地址不是i的值,你这样试试:
int *getPInt(void){
int *i=100;
return *i;
}
[/Quote]
this is no help.
回复
westlife_2011 2012-06-30
呵呵,你很幸运,恰巧你返回的地址100是你想要得到的数值。但是其实你返回的是i的地址不是i的值,你这样试试:
int *getPInt(void){
int *i=100;
return *i;
}

回复
iamnobody 2012-06-30
不是不安全,而是根本就是一个错误!

一个错误什么时候会暴露给初学者知道?天知道.
回复
左眼看到鬼 2012-06-30
我的输出的是0.楼主换个编译器试试,你只是运气好而已,同楼上

akaedu@akaedu:~/write$ gcc 1.c
1.c: In function ‘getPInt’:
1.c:11: warning: function returns address of local variable
akaedu@akaedu:~/write$ ./a.out
j points to a local location,it is0

回复
pathuang68 2012-06-30
结果是未定义的。

这次是楼主运气好,下次就未必了。
回复
发动态
发帖子
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
社区公告
暂无公告