一个有关指针的问题

葛俊在新泽西 2003-10-15 06:53:37
#include "stdafx.h"

char * test()
{
char ch_test[100]="test";
return ch_test;
}

int main(int argc, char* argv[])
{
printf(test());
getchar();

return 0;
}

在函数调用结束时ch_test指向的内存应该是无效的,但是test()却以内部指针ch_test作为返回值,而且结果还正确了。请问这是为什么?

...全文
47 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
daizh 2003-10-15
  • 打赏
  • 举报
回复
楼主的问题:
你运行正确,只能是偶然。对于函数返回值的讨论很多以前的帖子讨论过,你可以参考看看。对于你这个具体问题来说,你违背了“函数中返回值不能是局部变量或临时变量”的原则。
wangyangcheng 2003-10-15
  • 打赏
  • 举报
回复
借一下樓主的寶地﹐在下面這一小段代碼中﹐
#include <iostream>
#include <vector>
using namespace std;

vector<int>* seq(int pos)
{
static vector<int> seq_vec;
for(int i=seq_vec.size();i<=pos;i++)
seq_vec.push_back(i);
return &seq_vec;
}
int main()
{
int size;
cout<<"Please enter the size:";
cin>>size;

vector<int>* ptr_seq=seq(size);
for(int i=0;i<ptr_seq->size();i++)
cout<<(*ptr_seq)[i]; //若把這里改成 cout<<*ptr_seq++;就會報錯。
cout<<endl; //按iterator的實現來說﹐這應該屬于指針的算朮運
return 0; //算沒錯呀?為什么呢?
}


Thanks!
Hot_Forever 2003-10-15
  • 打赏
  • 举报
回复
不对啊,我把你的程序跟踪了一下
char *s=test(); 
printf("%s",s);  //这时候输出s为空,证明test的返回值并没有正确的赋给s

lemon520 2003-10-15
  • 打赏
  • 举报
回复
理论上说是ch_test指向的内存是未知的,是保存的最近一次操作的结果。
很显然,你在返回指针后没有进行其他操作,所以结果未变。
zhuixe 2003-10-15
  • 打赏
  • 举报
回复
ch_test[100]="test";

ch_test所指向的内存虽然被释放了,但其中的数据暂时还没被改变
luopeng 2003-10-15
  • 打赏
  • 举报
回复
因为那块内存虽然释放了,但没有其他的应用程序分配更改它,
当然不会出错,可是现在你能读,你写一下那块区域试试呢?
马上就会出错了哈。
rtdb 2003-10-15
  • 打赏
  • 举报
回复
算是偶然性正确吧。
因为还没有人改写那块内存。

若是中间再有其它内存操作,
结果就很可能不正确了。

69,369

社区成员

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

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