
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指向的数据没有释放,那是一个数组,这怎么可能? 展开
{
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指向的数据没有释放,那是一个数组,这怎么可能? 展开
2个回答
展开全部
楼主针对你这句给你解释下:
“str 属于局部变量,位于栈内存中,在Func 结束的时候被释放,所以返回str 将导致错误。
为什么当返回的是int *p类型时却正确?按理说应该都被释放了。”
无论是 str还是整型指针p所指向的空间,确实都已经被释放了,只是这个释放你要理解清楚,一般的编译器,释放!=清零(至少我没见过释放同时会清零相应内存的编译器),释放只是告诉系统,这一块内存我不用了,他就像海域的公海一样,只要你还有这块内存的地址,一样可以访问,只是这段内存随时可能分配给其他进程使用,随时可能被修改,在被其他进程占用修改之前,你都是可以访问这段内存的(因为释放内存时,指针变量str和p的值不会变,始终指向给他赋值时指向的那一块内存空间,尽管指向的内存已经不归本进程使用,其实现在str和p已经就是所谓的野指针)。
整型指针所指向的内存块只有四个字节,一般释放后马上被分配给其他进程,并被修改的可能性不大,如果是一个字符串,一旦代表字符串结束符的‘\0’被修改,很容易就会报一个访问越界,或段错误…………
一般编程的时候,不要返回一个局部变量指针,这种错误是非常危险的,因为它什么时候出错是有一定的随机性,以后排错的时候都很难,就像野指针一样。
“str 属于局部变量,位于栈内存中,在Func 结束的时候被释放,所以返回str 将导致错误。
为什么当返回的是int *p类型时却正确?按理说应该都被释放了。”
无论是 str还是整型指针p所指向的空间,确实都已经被释放了,只是这个释放你要理解清楚,一般的编译器,释放!=清零(至少我没见过释放同时会清零相应内存的编译器),释放只是告诉系统,这一块内存我不用了,他就像海域的公海一样,只要你还有这块内存的地址,一样可以访问,只是这段内存随时可能分配给其他进程使用,随时可能被修改,在被其他进程占用修改之前,你都是可以访问这段内存的(因为释放内存时,指针变量str和p的值不会变,始终指向给他赋值时指向的那一块内存空间,尽管指向的内存已经不归本进程使用,其实现在str和p已经就是所谓的野指针)。
整型指针所指向的内存块只有四个字节,一般释放后马上被分配给其他进程,并被修改的可能性不大,如果是一个字符串,一旦代表字符串结束符的‘\0’被修改,很容易就会报一个访问越界,或段错误…………
一般编程的时候,不要返回一个局部变量指针,这种错误是非常危险的,因为它什么时候出错是有一定的随机性,以后排错的时候都很难,就像野指针一样。
参考资料: 版权所有-Q-289854934
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询