返回局部变量时,函数将值复制保存给调用者,函数执行完毕后内存空间被释放;
返回指针时,函数返回的地址,但是此时地址空间已经被释放,已经得不到值,所以会有错误;
#include <stdio.h> #include <string.h> char* get_str(void) { char* str = "abcd"; return str; } int main(int argc, char* argv[]) { char* p = get_str(); printf("%s\n", p); return 0; } |
上述代码中,str是局部变量,函数返回后应该释放掉了,但为什么get_str返回后,还能正常输出呢?
char *str="abcd"; 这种方式内存分配在静态存储区,str指向"abcd"这一字符串常量,get_str()函数返回指向这一字符串常量的地址的指针,所以会有main中的打印结果
字符串常量的地址是存放在局部变量str中的,get_str()返回后这个局部变量str被释放了,怎么会有正确结果呢?
打个比方:
阿四知道CU网站的地址。
阿三打电话给(call)阿四,“阿四,告诉我CU网站的地址”
阿四告诉阿三CU网站的地址后就跑掉了,阿四不见了,但CU网站还在。
阿三知道了CU网站的地址,也就找到了CU网站。
阿四知道CU网站的地址。
阿三打电话给(call)阿四,“阿四,告诉我CU网站的地址”
阿四告诉阿三CU网站的地址后就跑掉了,阿四不见了,但CU网站还在。
阿三知道了CU网站的地址,也就找到了CU网站。
返回局部指针不正确,但如果局部指针指向静态区常量还是不会出错的
————————————————————————————————————————————————
一般的来说,函数是可以返回局部变量的,
函数一般的操作是吧局部变量复制后返回给调用者,不能返回局部变量的是指针,因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。但是其他的值都是没问题的,其实都是一样的东西,只是指针在这种情况下被混淆了。
局部变量的作用域只在子函数内,在返回后,局部变量的内存已经释放。所以,如果是值的话,不涉及地址,程序不会出错。但是,
如果是地址的话,程序会在运行后出错!有时候这个错误不会在运行时马上出现,但是这个错误始终是潜在的风险!