1. 程式人生 > >關於函數返回值為指針類型的分析

關於函數返回值為指針類型的分析

三種 類型 常用 指針 動態內存 () 全局變量 動態 int

註意(原則):永遠不要返回一個局部變量的指針或引用(其實是隱式的指針),可以返回局部變量本身,因為函數執行完之後,將釋放分配給局部變量的存儲空間,局部變量只是臨時的存儲空間,此時,對局部變量的引用和地址就會返回不確定的內存。

抓住這個原則,我們來看一下例子:

1.返回變量本身

//這個返回變量本身內存可以,正確
int add(int x, int y)
{
    int sum = x + y;
    return sum;
}

int main()
{
    int a = 3, b = 5;
    cout << add(a, b) << endl;
}

2.返回局部變量指針,用法錯誤

int* add(int x, int y)
{
    int sum = x + y;
    return &sum;    
}

int main()
{
    int a = 3, b = 5;
    cout << *add(a, b) << endl;
}

會出現以下警告:

warning: function returns address of local variable [-Wreturn-local-addr]

return &sum;
^

警告:函數返回地址是局部變量地址--->這是不安全的

該如何解決這種錯誤呢?

方案有以下3中常用方案:

1.使用靜態變量

2.使用全局變量

3.申請堆區變量

其實,使用這三種方法是為了延長變量的聲明周期,從而達到返回的地址是確定的而不是不確定的

法1:

int* add(int x, int y)
{
    static int sum;
    sum = x + y;
    return &sum;
}
int main()
{
    int a = 3, b = 5;
    cout << *add(a, b) << endl;
}

法2:

int sum;

int& add(int x, int y)

{
    sum 
= x + y; return sum; }
int main()
{
    int a = 3, b = 5;
    cout << *add(a, b) << endl;
}

法3:

int* add(int x, int y)

{
  int* sum = new int;
  *sum = a + b;
  return sum;
}

int main()
{
    int a = 3, b = 5;
   int *result;
   result = add(a, b); cout << *result << endl;
   delete result; }

法3需要註意,由於用new申請的動態內存,調用者(這裏是main)需要釋放這個申請的指針free, delete

參考:http://blog.chinaunix.net/uid-20788636-id-1841283.html

關於函數返回值為指針類型的分析