簡體   English   中英

C++ 傳遞指針

[英]C++ passing pointers

我期待下面的代碼打印 1 但它打印一個隨機的大數字。 不明白為什么會這樣,請指教。

#include <iostream>
using namespace std;

int * returnArray()
{
    int myArray[5]={1,2,3,4,5};
    return myArray;
}

void printArray(int * myArray)
{
    cout << *myArray<< endl;
}

int main()
{
    printArray(returnArray());
}

在您的代碼中, returnArray返回指向myArray的第一個元素的指針,該元素位於 function 的本地。 當 function 返回時,其局部變量的 memory 在調用堆棧被彈出時被釋放,因此它可以用於其他目的。 在這種情況下,由於您之后調用printArray ,原來 returnArray 占用的堆棧區域被returnArray重用,所以原來包含myArrayprintArray現在有不可預測的內容。

正如 James Kanze 指出的那樣,完成你想要的最好的方法可能是使用std::vector<int>而不是int* ,像這樣

std::vector<int> returnArray()
{
    int myArray[5] = { 1, 2, 3, 4, 5 };
    std::vector<int> result(myArray, myArray + 5);
    return result
}

並相應地修改其他函數以獲取向量。 請注意,在printArray中,您需要myVector[0]來訪問第一個元素,因為向量不是指針。

function returnArray是返回指向堆棧數據的指針,返回后將不再有效。 變量myArray[5]存儲在堆棧中。 function返回后,堆棧用於存儲其他數據。 所以返回地址處的值對於調用function來說沒有意義。

因為此代碼會導致Undefined Behavior
您的數組是 function 的本地數組,當 function 返回時它會被破壞。
返回 function 中的局部變量的指針或引用是未定義的行為。

未定義的行為意味着任何事情都可能發生,並且無法解釋該行為。 該程序可能工作,也可能不工作,甚至崩潰,無法定義結果。

當您在 printArray function 中引用 int myArray[] 時,它超出了 scope。 這意味着 printArray() 中的指針 *myArray 指向堆棧上不再有效的一些垃圾。

當 returnArray 返回時,myArray 會脫離 scope。 換句話說,您正在返回一個指向不再存在的數據的指針。

有幾個解決方案。 您可以使 myArray 成為全局變量,或者您可以動態分配它,如

int myArray[5] = new int[5];

如果你這樣做,當你不再需要它時,你必須刪除它,使用如下語句

delete[] myArray;

將陣列 object 更改為永久陣列。
IE。 使其成為 static 存儲持續時間 object。 這意味着它的使用壽命將比 function 調用/

int * returnArray()
{
    static int myArray[5]={1,2,3,4,5};
  //^^^^^^  
  // a static in function scope means the variable is a static storage duration
  // object. This means its life span is longer than the application (ie it will
  // be tidied up after main exits).
  //
  // Thus it is perfectly valid to return it as the result from the function.

    return myArray;
}

在您的版本中,object 是一個自動變量。
這意味着它在退出 scope(在函數結束時)后不再存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM