楼主针对你这句给你解释下:
创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、网站设计、外贸营销网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的芜湖网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
“str 属于局部变量,位于栈内存中,在Func 结束的时候被释放,所以返回str 将导致错误。
为什么当返回的是int *p类型时却正确?按理说应该都被释放了。”
无论是 str还是整型指针p所指向的空间,确实都已经被释放了,只是这个释放你要理解清楚,一般的编译器,释放!=清零(至少我没见过释放同时会清零相应内存的编译器),释放只是告诉系统,这一块内存我不用了,他就像海域的公海一样,只要你还有这块内存的地址,一样可以访问,只是这段内存随时可能分配给其他进程使用,随时可能被修改,在被其他进程占用修改之前,你都是可以访问这段内存的(因为释放内存时,指针变量str和p的值不会变,始终指向给他赋值时指向的那一块内存空间,尽管指向的内存已经不归本进程使用,其实现在str和p已经就是所谓的野指针)。
整型指针所指向的内存块只有四个字节,一般释放后马上被分配给其他进程,并被修改的可能性不大,如果是一个字符串,一旦代表字符串结束符的‘\0’被修改,很容易就会报一个访问越界,或段错误…………
一般编程的时候,不要返回一个局部变量指针,这种错误是非常危险的,因为它什么时候出错是有一定的随机性,以后排错的时候都很难,就像野指针一样。
p是指向局部变量的指针,当函数退出时,局部变量会被释放,这时,p所指向的位置就不一样是原来的数。
因为fun()函数返回的值被计算机的临时变量存放,当赋值给p的时候,p是指向临时变量的地址,所以还可以读取出100。
*p = "hello"这是常量字符串,从静态存储区分配,第一步字符串"hello"从静态存储区获取一块内存,指针变量p才指向这块静态内存,这块内存的特点是从程序开始到结束一直从在,所以可以返回。
扩展资料:
函数的返回值类型是在定义函数时指定的。return 语句中表达式的类型应与定义函数时指定的返回值类型一致。如果不一致,则以函数定义时的返回值类型为准,对 return 语句中表达式的类型自动进行转换,然后再将它返回给主调函数使用。
在调用函数时,如果需要从被调函数返回一个值供主调函数使用,那么返回值类型必须定义成非 void 型。此时被调函数中必须包含 return 语句,而且 return 后面必须要有返回值,否则就是语法错误。
参考资料来源:百度百科-返回值
C语言中的return命令结束函数,返回调用者
如果函数定义是有返回值的,则return 后面会跟一个相应类型的常量或变量,目的是返回给调用者一个数据(数值)。
函数定义格式:
返回值类型 函数名( 形参及类型 )
{
函数语句;
return 相应返回值类型的常量或变量 ;
}
返回值是需要调用者用变量来接收的,不是显示到屏幕上的。如果需要输出返回值,则需要调用相应的输出语句,进行数据输出。
例:
int max( int a, int b )
{
if ( ab ) return a;
else return b;
}
char *input(char *s )
{
gets(s);
return s ;
}
void main()
{
int a=3,b=5;
int m;
m=max(a,b); //用m接收返回值
printf("max=%d\n", m ); //输出
char str[100];
char *p;
p=input(str); //指针变量p接收返回值
printf("input=%s", p ); //输出地址中的字符串数据
}
在C语言中,局部变量的作用域只在函数内部,在函数返回后,局部变量的内存就会被释放。如果函数只是返回局部变量,那么这个局部变量会被复制一份传回被调用处。但是如果函数返回的是局部变量的地址,那么就会报错,因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放,这样指针指向的内容就是不可预料的内容,程序就会出错。准确的来说,函数不能通过返回指向栈内存的指针(返回指向堆内存的指针是可以的)。
我给你从编译器角度考虑下吧!1、首先局部变量的使用范围只有在这个局部范围类有效。2、函数是模块化的思想。比如你有一个判断一个数是否是素数的函数。那么你再求100以内所有素数和的时候,main中会调用这个函数100次。这些函数编译器在处理的时候都是放在一个堆栈的。而且每个函数都占有不同的地址和空间。(递归函数尤为明显)。最关键的是,当函数返回函数值后,函数的使命就结束了。所以这个函数体在呢内存中就销毁了。你即使能从函数中返回一个局部变量。你再去读这个地址的时候。东西都不在了。3、还有一点。编译器在分配函数的空间的时候,地址不是固定的。所以你每次运行程序,你会发现
int
a=3
printf(f"%d",a),不都是一样的。所以你的问题很明了了。