社区
C语言
帖子详情
为什么不可以返回局部变量的指针
swuxd
2010-05-24 03:42:32
请详细讲一下,一两句话我可能还理解不了
...全文
1731
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 #//不可以,原因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的 说的很具体啦
♂愤怒的it男♂
2010-05-25
打赏
举报
回复
局部变量只限制于局部,例如函数中定义的变量就只在函数中起作用,当该函数结束后,该变量的存储单元也就被释放了,而局部变量指针就是指向这些局部变量的,如果这些内存单元被释放之后,指向这些内存单元的指针也就没用了。
不过你可以定义局部静态变量,之所以是静态的,因为这些变量的存储单元在函数结束后不会被释放,而是一直保留着
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=∑
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)
c++ primer第五版第6章答案
c++ primer第五版第6章答案
C++不可以
返回
局部变量
的引用或
指针
返回
引用事实上是
返回
变量的地址。 所谓的不可以
返回
局部变量
的引用或
指针
,指的是不能
返回
局部变量
的引用或地址给引用或
指针
。事实上还是看该地址的位置是否在该函数的栈区,若是在栈区,函数调用结束,该地址就被释放了。尽管会出现栈地址上的值没被销毁的问题,可能是该栈区还没被其他的函数堆栈掉。 1、int & fun() { int a = 10; return a; } 不可以
函数
返回
局部变量
/局部
指针
c语言
返回
局部变量
局部
指针
局部数组 内存四区模型 讨论这个问题之前,一定要理解堆区和栈区的工作原理,数据的存储区域(参考内存四区模型),另外一定不要
返回
局部对象或变量的引用和
指针
。
局部变量
局部变量
分局部自动变量和局部静态变量,由于c
返回
的是值,因此
返回
一个
局部变量
是可以的,无论自动还是静态,因为这时候
返回
的是这个
局部变量
的值。另外,函数
返回
局部变量
时实际上是
返回
变量值...
C
指针
以及为什么不能
返回
局部
指针
变量,却可以
返回
局部变量
指针
,是一个无符号整数(unsigned int),它是一个以当前系统寻址范围为取值范围的整数。如:int* 是一个
指针
变量类型
指针
变量和普通变量没有什么区别,
指针
32位四字节,里面保存的是一个内存空间的地址,就像一个整形变量int a, a就可以代表一个整数,一个
指针
变量int* p,p就可以代表一个地址数据,而*地址,代表去这个地址指向的内存空间取出里面的内容,因此如果是要取出这个
指针
所指向的...
为什么
返回
值为数值时,
返回
局部变量
可以。而
返回
值为引用时,不能
返回
局部变量
最重要的一点:函数不能
返回
指向栈内存的
指针
! 为什么?因为
返回
的都是值拷贝! 一般的来说,函数是可以
返回
局部变量
的。
局部变量
的作用域只在函数内部,在函数
返回
后,
局部变量
的内存已经释放了。因此,如果函数
返回
的是
局部变量
的值,不涉及地址,程序不会出错。但是如果
返回
的是
局部变量
的地址(
指针
)的话,程序运行后会出错。因为函数只是把
指针
复制后
返回
了,但是
指针
指向的内容已经被释放了,这样...
C语言
70,005
社区成员
243,256
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章