2013-03-14 108 views
0

我目前正在學習C++,所以如果我看起來有點傻,對不起。C++使用指針創建數組

我目前的練習,我堅持要求我編寫一個函數IndexArray(int n),它返回一個指向動態分配的具有n個元素的整數數組的指針,每個元素都被初始化爲它自己的索引。 (從工作表複製)。

我讀過幾次和不完全瞭解,但他們舉了一個例子:

假設IntPtr的聲明爲

int *intPtr; 

聲明

intPtr = IndexArray(10); 

應產生以下內存配置:

intPtr -> 0 1 2 3 4 5 6 7 8 9 

從這個例子我猜我的函數需要創建一個大小爲n的數組,其值從0到n-1,然後另一個指針需要指向該數組。

這裏是他們的測試代碼:

int *values1; 
values1 = IndexArray(10); 

我知道如何輕鬆地創建數組,但我不完全理解指針足以知道要做什麼真的。我想返回一個數組會工作:

int *IndexArray(int n) { 
    cout << n << endl; 
    int arrayTemp[n]; 
    for(int i = 0; i < n; i++) { 
     arrayTemp[i] = i; 
    } 
    return arrayTemp; 
} 

但是測試時,值1陣列不會從0-9所包含的值(雖然arrayTemp做所返回的權利之前)。

任何幫助將是驚人的,並希望我已經給你所需要的一切幫助。謝謝! :d

+0

int arrayTemp [n]; => int * arrayTemp = new int(n);分配給int arrayTemp [n]的Beacuse內存將在返回arrayTemp後被釋放; – neohope 2013-03-14 05:14:53

+0

這不是C++。 C++不支持VLA(可變長度數組)。標記已更改爲C – 2013-03-14 05:20:04

+0

這是C++,它不是可變長度數組。數組的長度永遠不會改變。將長度發送到函數,並根據發送的長度創建數組的大小。那之後永遠不會改變。 – 2013-03-14 05:26:56

回答

3
int arrayTemp[n]; 

注意,該語句是一個函數,所以當函數結束時,arrayTemp []將不提供任何更多的,它承擔責任:水災被刪除:它是一個本地##變量!

所以,如果你想這樣做,你可以使用:

int * arrayTemp = new int[n]; 

注意:你必須刪除任何如何避免內存泄漏。

2

你不能做到這一點:

int *IndexArray(int n) { 
    cout << n << endl; 
    int arrayTemp[n]; //declare a local array 
    for(int i = 0; i < n; i++) { 
     arrayTemp[i] = i; 
    } 
    return arrayTemp; //return a pointer to a local 
} 

您可以將指針不能返回到本地。一旦你回來,本地不復存在。指針現在指向垃圾。

相反,你必須使用malloc(C或C++)或new(C++),爲10個整數動態創建的存儲,並且因爲這是動態的堆上創建它會返回後仍然存在(和將需要free d if malloc ed或delete[] d如果它是由new製成的陣列。對於僅由new製成的單個對象,您只需使用delete

+0

我想補充一點,你也可以傳遞一個指向'n'' int'的指針並將其填充到函數 – 2013-03-14 05:19:46

+0

@Ed S.'IndexArray(int n ),它返回一個指向動態分配的整數數組的指針'。如果它填充傳遞給它的數組,它不會進行動態分配。 – Patashu 2013-03-14 05:22:24

+0

是的......我明白這一點。問題是你說你*有*使用動態分配,這是不正確的,誠實地說是一個壞主意開始。至少返回一個智能指針。另一種選擇是將數組作爲參數並不返回任何內容。 – 2013-03-14 06:06:05