C语言编程陷阱(八)
陷阱36:不要使用指针作为函数的返回值
有时候,我们可能想要用一个函数来返回一个指针,比如返回一个动态分配的内存,或者返回一个数组的某个元素的地址。但是,如果我们不小心,我们可能会犯一个很常见的错误,就是返回一个局部变量的地址。例如,看看下面的代码:
#include <stdio.h>
int *get_max(int a, int b) {
int max;
if (a > b) {
max = a;
} else {
max = b;
}
return &max; // 返回局部变量的地址
}
int main() {
int *p = get_max(10, 20); // 调用函数,得到一个指针
printf("%d\n", *p); // 打印指针指向的值
return 0;
}
这段代码看起来没有什么问题,但是实际上,它是错误的。为什么呢?因为在函数get_max
中,变量max
是一个局部变量,它只在函数的作用域内有效,当函数返回后,它就会被销毁,它的地址就不再有效。所以,当我们在主函数中打印指针指向的值时,我们可能会得到一个不可预知的结果,甚至是一个垃圾值或者一个错误。
这就是一个指针作为函数返回值的陷阱,我们应该避免这样做。如果我们真的需要返回一个指针,我们应该确保它指向的是一个有效的内存区域,比如一个全局变量,或者一个动态分配的内存,或者一个函数参数。例如,我们可以修改上面的代码如下:
#include <stdio.h>
#include &l