分类: C/C++
2009-06-13 11:38:11
问题:
#include
float *get_scores()
{ cout<<"Enter the scores of Chinese, Math, Physics, Chemistry, English : \n";
float scores[5]; //出错的地方,这个数组是函数get_scores()的自动变量(局部变量),当函数
//运行完是,退出放回main函数,get_scores内的所有自动变量(stack内分配)都被系统回收了
//故,在main函数内,指向这块内存的指针,就会出问题
for(int i=0; i<=4; i++)
cin>>scores[i];
return scores;
}
main()
{ float *s_ptr;
s_ptr=get_scores();
for( int j=0; j<=4; j++)
{cout<<*s_ptr<return 0;
}
我的代码是这样的,怎么改才能让它输出的值等于输入的值呢。
谢谢,不过我想要的是不通过参数传递实现的方法,想多了解指针的应用
---------------------------------------------------------------------------------
Answer:
scores[5]; 是局部变量,当在函数执行结束时它的生命期也结束了,所以返回的指针也是一个末知地址.这在你以后的操作中是非常危险的(由于指针的灵活性,当刚刚释放的空间被别的程序申请到时,当你改变他指向地址的内容时,出现数据不一致,程序Crash是很正常的事).
如果非要返回一个数组,那就使用new. 可new出来的空间一定要在不使用的时候记得释放(delete),要不就会发生memory leak.
你的程序可改为如下:
float *get_scores()
{ cout<<"Enter the scores of Chinese, Math, Physics, Chemistry, English : \n";
float * scores = new float[5];
for(int i=0; i<=4; i++)
cin>>scores[i];
return scores;
}
main()
{ float *s_ptr;
s_ptr=get_scores();
for( int j=0; j<=4; j++)
{cout<<*s_ptr<
delete []s_ptr; //释放内存空间
return 0;
}
第二种方法,可使用static关键字,定义成静态数组.
float *get_scores()
{ cout<<"Enter the scores of Chinese, Math, Physics, Chemistry, English : \n";
static float scores[5];
for(int i=0; i<=4; i++)
cin>>scores[i];
return scores;
}
main()
{ float *s_ptr;
s_ptr=get_scores();
for( int j=0; j<=4; j++)
{cout<<*s_ptr<
return 0;
}
------------------------------------------------------------------从表面上来看,这个程序好像是函数返回值的问题,不过实际上是变量生命周期的问题。
当get_scores运行完的时候, scores[5] 的生命也走到了尽头,会被系统收回内存,所以你现在返回的指针指向的是一个不可预知的知。
你可以在main函数中定义这个数组,并将其作为参数传给get_scores,这样,就可以满足你的要求了。
补充,那你就直接把 scores[5],设为一个全局变量就可以了,或者你这样写
float scores = new float [5];
这样在栈上分配内存,系统应该不会自动回收,就可以在后面访问了,试试?