有时候,我们可能想要用一个函数来返回一个指针,比如返回一个动态分配的内存,或者返回一个数组的某个元素的地址。但是,如果我们不小心,我们可能会犯一个很常见的错误,就是返回一个局部变量的地址。例如,看看下面的代码:
- #include
-
- 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
- #include &l