搜尋

首頁  >  問答  >  主體

C++ 函数中返回局部指针地址的问题

我们都知道,C++ 函数中是可以进行局部变量的返回的,返回局部变量时要注意不能返回指向栈内存的指针

这是因为局部变量的作用域是函数内部,函数一旦执行结束,栈上的局部变量会进行销毁,内存得到释放。因此,如果函数返回的是该局部变量的值拷贝,这是没有问题的。但是如果返回的是局部变量的地址,那么返回的只是该局部变量指针的拷贝,而随着函数运行结束,该拷贝指针所指向的栈内存已经被释放,那么指向一个未知区域就会导致调用的错误。

具体看下面的例子:

#include <iostream>
using namespace std;

int* test_1(){
    int d=2;
    int c = d;
    // return &d;
    return &c;
}

int* test_2(){
    int d[] = {1,2};
    return d;
}

int* test_3(){
    int d[] = {1,2};
    int *t = d;
    return t;
}

char* test_4()
{
    char str[]="HelloJacky";
    return str;
}

char* test_5()
{
    char* str=(char*)"HelloJacky";
    return str;
}

int* test_6(){
    int a = 1;
    int *b = &a;
    return b;
}

int main(void)
{
    int *p = 0;
    cout << *test_1() << endl;
    cout << *test_2() << endl;
    cout << *test_3() << endl;
    cout << *test_4() << endl;
    cout << *test_5() << endl;
    cout << *test_6() << endl;
}

编译会给出下面的提示:

也就是说 test_1, test_2, test_4,编译器都会警告,引用栈空间的地址(一定要避免这种情况)。

那么问题来了,为什么 test_3,test_6 没有警告呢?

PHP中文网PHP中文网2803 天前559

全部回覆(3)我來回復

  • 天蓬老师

    天蓬老师2017-04-17 13:47:52

    因為test1,test2,test4他們都是直接返回指向內存的變量,編譯的時候語法分析到就提出警告,test3,test6都是間接的指向內存,編譯器沒有深層的分析語法,所有,沒有提出警告。

    回覆
    0
  • 黄舟

    黄舟2017-04-17 13:47:52

    因為寫編譯器的人這麼判斷的.... 有時候可能你就是要回傳一個指標本身呢。

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 13:47:52

    編譯器能做的是盡量給你警告,我覺得標準沒有規定test_3、test_6這樣的行為必須給警告。

    回覆
    0
  • 取消回覆