Chinaunix首页 | 论坛 | 博客
  • 博客访问: 467831
  • 博文数量: 148
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 1553
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-23 23:09
文章分类

全部博文(148)

文章存档

2010年(6)

2009年(58)

2008年(84)

我的朋友

分类: 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];
这样在栈上分配内存,系统应该不会自动回收,就可以在后面访问了,试试?


阅读(2026) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~