[英]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
重用,所以原來包含myArray
的printArray
現在有不可預測的內容。
正如 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.