为什么不可以返回局部变量的指针

swuxd 2010-05-24 03:42:32
请详细讲一下,一两句话我可能还理解不了
...全文
1521 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
mainwhile 2011-01-19
  • 打赏
  • 举报
回复
int* sum()
{
int sum=0;
int *p=∑
for(int i=1;i<101;i++)
sum+=i;
return p;
}

int main()
{
int *q;
q=sum();
cout<<*q<<endl;

return 0;
}
看看这个吧
ab320 2010-08-28
  • 打赏
  • 举报
回复
嗯,很好。
sky198306 2010-07-15
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 swolf_qu 的回复:]
首先顶16楼,但我也补充一点点:

18 int *r_int()
19 {
20 int num;
21 num = 5;
22 return &num;//不可以,原因16楼已经说了,分配的是栈内存,本函数用完后就释放。
23 }


27 int *r_static_int()
28 {
29 static int i;
30 i =……
[/Quote]

这个好详细
种菜的 2010-05-25
  • 打赏
  • 举报
回复
回答中的好多都错了,但是16楼所说是对的:
函数中的变量存储空间是在栈上分配的,函数结束时自动释放,所以不能返回这样的变量,即使你返回了,就像7楼所说的,也得到了正确的值,请不要高兴,这是因为那块内存还没有被占用,值还没有改变,所以你得到了正确的值,有一种情况是可以返回局部指针的,就是在堆上动态分配存储空间,这些空间在函数结束时不会自动释放,但是需要自己释放,所以得记住,要是忘记了就漏掉了。
Cniao_zhi 2010-05-25
  • 打赏
  • 举报
回复
顶16L的 说的很具体啦
  • 打赏
  • 举报
回复
局部变量只限制于局部,例如函数中定义的变量就只在函数中起作用,当该函数结束后,该变量的存储单元也就被释放了,而局部变量指针就是指向这些局部变量的,如果这些内存单元被释放之后,指向这些内存单元的指针也就没用了。
不过你可以定义局部静态变量,之所以是静态的,因为这些变量的存储单元在函数结束后不会被释放,而是一直保留着
Mg 2010-05-25
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
hpzhpz 2010-05-25
  • 打赏
  • 举报
回复
重新看看基础方面的书
seesunny1 2010-05-25
  • 打赏
  • 举报
回复
可以返回堆空间的指针,
栈就不可以了
swuxd 2010-05-25
  • 打赏
  • 举报
回复
shenxinbo 2010-05-25
  • 打赏
  • 举报
回复
四楼的代码是不对的,里面有点问题:

C/C++ code
int* sum() //求1..100的和,是5050
{
int sum=0;
int *p=&sum;
for(int i=1;i<101;i++)
sum+=i;
return *p;
}

怎么能return *p呢,应该return p;
aozhi 2010-05-25
  • 打赏
  • 举报
回复
个人觉得标识符可以称为全局、局部;变量要称为自动变量,静态变量和堆变量比较好。
这样会消除很多歧义。
aozhi 2010-05-25
  • 打赏
  • 举报
回复
函数结束后,堆栈释放。返回的指针就变成野的了。
swolf_qu 2010-05-25
  • 打赏
  • 举报
回复
首先顶16楼,但我也补充一点点:

18 int *r_int()
19 {
20 int num;
21 num = 5;
22 return #//不可以,原因16楼已经说了,分配的是栈内存,本函数用完后就释放。
23 }


27 int *r_static_int()
28 {
29 static int i;
30 i = 5;
31 return &i; //可以,分配在全局区(静态区),进程运行过程中一直存在。
32 }


36 char *r_chara()
37 {
38 char ch[10];
39 strcpy(ch,"hello");
40 return ch; //不可以,栈内存。
41 }


44 char *r_charp()
45 {
46 char *str;
47 str = (char *)malloc(10);
48 if(NULL == str)
49 {
50 printf("malloc error\n");
51 return NULL;
52 }
53 strcpy(str,"world");
54 return str; //可以,分配在堆中,只有调用free才会释放。
55 }
cao_julians 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yxriyin 的回复:]
因为函数中的局部变量在函数调用结束后就会被释放,
所以如果你在函数内部定义一个指针,并申请了空间,
那么你返回指针后它所指向的空间就被释放了,这个指针就野了
[/Quote]
===============
这个解释不对:
1.局部变量的指针和局部指针变量是两个不同概念
2.局部变量在函数体结束后生命期也结束,它的指针(即它的地址)是无效变量的地址,所以函数不能返回这种地址值
3,局部指针变量在函数结束后生命期也结束,但它指向的变量或函数或任何存储实体的生命期没有结束,函数返回的指针(地址)就是有效的
例1:
int *func()
{
int x;
...
return &x;/*返回局部变量的地址--无效*/
}
例2.
int *max(int a[],int n)
{
int *p=a[0];
int i;
for(i=1;i<n;i++)
{
if(*p<a[i])
p=&a[i];/*p指向更大的数*/

return p;
}/*尽管p变量生命期结束了,但函数返回它的值,是实参数组中最大元素的地址--有效*/
种菜的 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 boover 的回复:]
普通变量,确实如此;不过对于字符串变量就不一样了,函数里的字符串指针是可以返回的。
如:

C/C++ code

#include<stdio.h>
char *returnstr()
{
char *str="Hello!World!\n";
return str; //"Hello!world!\n";
}
int ……
[/Quote]

这是个常量,不是变量哦。
liutengfeigo 2010-05-24
  • 打赏
  • 举报
回复
return *p; ???
linsj585 2010-05-24
  • 打赏
  • 举报
回复
哦,看来是没有被占用
linsj585 2010-05-24
  • 打赏
  • 举报
回复
int* sum() //求1..100的和,是5050
{
int sum=0;
int *p=∑
for(int i=1;i<101;i++)
sum+=i;
return *p;
}

void main()
{
...
int *q=sum();
cout<<*q<<endl; //本来你认为这里是5050,但是因为返回的是一个局部变量指针,在返回时,空间已经释放,所以这个空间存放的就不一定是5050(看是否被占用)
...
}




呃,还是5050,怎么回事?
用的是VC6
liutengfeigo 2010-05-24
  • 打赏
  • 举报
回复
这个指针是变量作用域是在这个函数中了,这个指针变量释放了,就不是相当于free(指针)了,???细节方面不清楚。
可以这么解释吧。。。~细节方面我也不清楚
加载更多回复(10)

69,369

社区成员

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

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