2013-02-11 34 views
-1

我有目標C的指針,那個叫:爲什麼我的C數組代碼沒有按預期工作?

int *binary[20] ; 

後來返回一個指針。

當我試圖一個編號分配給它:

binary[5]=1; 

我得到的錯誤。

我知道binary指向20個單元格的第一個單元格的地址。 爲什麼不能直接進入5號細胞?

回答

2

定義int* binary[20]定義了一個指向int的20個指針的數組。這真的是你想要的,還是你的意思是int binary[20]創建一個20 int s的數組?

無論哪種方式,結果數組都存儲在堆棧中,以便將指向此數組的指針返回給某些調用代碼時出錯。 (在您返回到調用代碼後,堆棧會解除展開,並且爲陣列保留的內存將被標記爲空閒。) 如果要使用調用代碼中的數組,則必須在堆上分配:

int *binary = calloc(20, sizeof(int)); 
binary[5] = 1; // fine, even after returning from this function 

這會讓你獲得一個指向內存的指針,即使在從函數返回後也是可用的。 (並且來電者有責任使用free來釋放該內存。)

無論如何,除非您有一些特定要求,否則應該使用NSArray或類似的集合類。 Objective-C中的一般規則是儘可能使用高級API,直到被迫採取其他措施。在一般情況下,爲幾個整數分配NSArray是完全可以接受的。

0

你已經聲明瞭一個指針數組。

這意味着你可以在該數組中存儲20個內存地址。

但是通過binary[5]=1;您正在綁定存儲整數,而不是int的地址。

您不能存儲類似靜態值的地址。

+0

'1'是'int'的有效地址,所以發佈的代碼應該可以工作。 – zoul 2013-02-11 10:29:10

0

您將指針數組聲明爲整數。您的類型是int *

如果您類型更改爲int,它將工作:

int binary[20]; 
binary[5] = 1; 

順便說一句,你的Q具有無關的Objective-C,但C.在Objective-C你是鼓勵儘可能使用對象。 (NSArrayNSValue)。

+0

請注意'1'是一個有效的指針,所以他的原代碼工作得很好。 – zoul 2013-02-11 10:28:20

+0

除非關閉所有編譯器警告,否則'1'不是有效的指針。另外_compiles_!= _works_。 – Tricertops 2013-02-11 13:46:37

+0

我有隱式的整數到指針轉換警告關閉,這就是爲什麼我的編譯器沒有抱怨。另外,原始代碼不僅會編譯,而且還會工作得很好,除非指針返回到調用代碼。 (不要混淆指針和整數是個好主意。) – zoul 2013-02-11 13:54:38

相關問題