c语言函数返回问题

char*Func(void){charstr[30];…returnstr;}str属于局部变量,位于栈内存中,在Func结束的时候被释放,所以返回str将导致错误。为... char * Func(void)
{
char str[30];

return str;
}
str 属于局部变量,位于栈内存中,在Func 结束的时候被释放,所以返回str 将导致错误。
为什么当返回的是int *p类型时却正确?按理说应该都被释放了。
我说的返回int *p类型是指这样:
#include <stdio.h>

int *fan()
{
//char str[20] = {1, 2};
int i = 2;
//printf("%s", str);
//char *p;
int *q;
q = &i;
//p = str;
return q;
}

void main()
{
int *a;
a = fan();
printf("%d", *a);
}
程序正确,但换成注释时就不正确。
按你说的str释放但str指向的数据没有释放,那是一个数组,这怎么可能?
展开
 我来答
benpaodaoren
2010-11-28 · TA获得超过658个赞
知道小有建树答主
回答量:173
采纳率:100%
帮助的人:88.4万
展开全部
楼主针对你这句给你解释下:
“str 属于局部变量,位于栈内存中,在Func 结束的时候被释放,所以返回str 将导致错误。
为什么当返回的是int *p类型时却正确?按理说应该都被释放了。”

无论是 str还是整型指针p所指向的空间,确实都已经被释放了,只是这个释放你要理解清楚,一般的编译器,释放!=清零(至少我没见过释放同时会清零相应内存的编译器),释放只是告诉系统,这一块内存我不用了,他就像海域的公海一样,只要你还有这块内存的地址,一样可以访问,只是这段内存随时可能分配给其他进程使用,随时可能被修改,在被其他进程占用修改之前,你都是可以访问这段内存的(因为释放内存时,指针变量str和p的值不会变,始终指向给他赋值时指向的那一块内存空间,尽管指向的内存已经不归本进程使用,其实现在str和p已经就是所谓的野指针)。
整型指针所指向的内存块只有四个字节,一般释放后马上被分配给其他进程,并被修改的可能性不大,如果是一个字符串,一旦代表字符串结束符的‘\0’被修改,很容易就会报一个访问越界,或段错误…………
一般编程的时候,不要返回一个局部变量指针,这种错误是非常危险的,因为它什么时候出错是有一定的随机性,以后排错的时候都很难,就像野指针一样。

参考资料: 版权所有-Q-289854934

297095637
2010-11-28 · TA获得超过506个赞
知道小有建树答主
回答量:483
采纳率:0%
帮助的人:364万
展开全部
释放的只是str,但是str指向的内存区域里面数据还是在的。

指针的存储时四个字节,int也是四个,char好像是一个字节,所以返回int*p是对的。

我是学计算机的,账号就是QQ号,可以加。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式