2012-11-18 55 views
1

我知道的數組c的malloc()VS {}

int *x = malloc(sizeof(int)*100); 

int x[100]; 

結果是相同的,但第一個被分配的堆存儲器中,並且第二個是分配堆棧記憶。

現在我需要創建一個巨大的數組(約10000個元素,而不是一個模式),我認爲malloc()更合適。

但是,當我準備初始化數組時,我面臨一個問題。 我不能使用任何循環來初始化數組,我怎麼能初始化,通過使用malloc,就像使用

int x[100] = {1,2,3,4,......,6,7,5}; 
+4

你不能循環初始化你的動態數組,因爲....? – WhozCraig

+0

*我不能使用任何循環來初始化數組* - 爲什麼不呢? – cdarke

+2

StackOverflow經驗法則#3有效:「如果OP說'我知道',他們不會。」 –

回答

2

當你說int a[] = { 1, 2, 3 };創建一個數組,你使用的是初始化提供初始數據爲(並推斷其大小)數組a。這是C.

的語法的一部分。當你說int * p = malloc(1000);,你只是做一個庫調用和存儲指針。語言或庫中沒有機制爲該指針指向的內存提供初始值,也不需要該指針指向任何內容(它可能是NULL)。你應該注意到數組不是指針,指針也不是數組。 ap是完全不同的動物,儘管事實上你可以說p[1] = a[1];

+0

有沒有不能像b一樣對待的情況?除了free()和realloc()之類的函數之外,或者將指針傳遞給a可能是不安全的。 – Paul

+0

@Paul:當然:'int n; p =&n;'是有效的,但是'a =&n;'不是。數組衰減產生「rvalues」(如果這是有道理的話)。此外,'&p'的類型爲'int **',而'&a'的類型爲'(int *)[3]'。 –

+0

這很有道理。 – Paul

0

如果您無法使用循環初始化數組,可以使用memset()並避開它。

0

如果數據不改變,最好的辦法是寫

static const int x [100] = { 23, 12, 5, 7, ... }; 

無代碼。沒有時間需要初始化。我已經看到了以這種方式初始化兆字節數據的代碼,沒有任何問題。