原则:尽量不要返回一个局部变量的指针或引用,因为函数执行完之后,将释放分配给局部变量的存储空间,局部变量只是临时的存储空间,此时,对局部变量的引用和地址就会返回不确定的内存,但可以返回局部变量本身,局部变量实际上是返回变量值的拷贝,虽然在函数调用结束后所在内存会被释放回收掉,但返回值不是地址,而是局部变量的拷贝副本。
1.返回局部变量(没有问题)
#include <stdio.h> #include <string.h> int add(int x, int y) { int sum = x + y; return sum; } int main() { int a = 3, b = 5; printf("%d+%d=%d",a,b,add(a,b)); }
2.返回局部变量指针(出现错误)
#include <stdio.h> #include <string.h> int* add(int x, int y) { int sum = x + y; return ∑ } int main() { int a = 3, b = 5; printf("%d+%d=%d",a,b,*add(a,b)); }
总结
局部变量:
局部变量分为局部自动变量和局部静态变量,无论自动还是静态,返回局部变量都是没有问题的,因为返回值不是地址,虽然在函数调用结束后(栈区)局部变量的内存会被释放回收掉,但函数返回的是变量拷贝副本。
局部指针:
局部指针分为局部静态指针和局部自动指针,可以返回一个局部静态指针的地址,但不应该返回一个局部自动指针的地址,除非自动指针的地址指向数据区或堆区。
返回局部静态指针变量的情况:
#include <stdio.h> #include <string.h> char * test(){ static char arr[] = "hello world!"; return arr; } int main() { printf("%s",test()); }
返回局部自动指针,但指向数据区的情况:
#include <stdio.h> #include <string.h> char * test(){ char *arr = "hello world"; //字符常量 return arr; } int main() { printf("%s",test()); }
该如何解决:
- 使用静态变量
- 使用全局变量