有兩種方法在C初始化數組:
- 在堆棧(當你的函數結束,這將處理內存給你,因爲它會被清理)
- 在堆(這將需要你自己處理分配和釋放)。
如果你想使用堆棧,你可以初始化數組像這樣...
#define ARRAY_LENGTH 10
void *ptr;
void *arr[ARRAY_LENGTH];
for (int i = 0; i < ARRAY_LENGTH; i++) {
arr[i] = ptr;
}
你同樣可以在堆上定義數組如下...
#define ARRAY_LENGTH 10
void *ptr;
void **arr = malloc(sizeof(void *) * ARRAY_LENGTH);
for (int i = 0; i < ARRAY_LENGTH; i++) {
arr[i] = ptr;
}
free(arr);
重要的是要記住,一個數組(除了在堆棧中分配的數組,其他屬性如長度)基本上只是一個指向第一個元素的指針,並且操作 arr [i]與移動相同,並且在第一個元素處訪問內存。如果你想獲得一個指向我個指標在數組中,那麼你可以使用符號,如...
void *indexPtr = arr + i;
或
void *indexPtr = &(arr[i]);
在這種方式下,一個數組 void *的類型爲 void **,因爲變量是指向數組的第一個成員的指針,這是一個指針。這可能有點令人困惑,但總是試着記住數組元素的類型,並創建一個指向它們的指針。因此,如果陣列是int類型的,則該數組將型 INT 或 INT []的,但是,如果要存儲指向整數,你會初始化類型的數組 INT *在任一這兩種形式...
int **arr = malloc(sizeof(int *) * ARRAY_LENGTH);
int *arr[ARRAY_LENGTH];
另外請注意,您在存儲指針,所以如果你運行的代碼......
int *arr[4];
for (int i = 0; i < ARRAY_LENGTH; i++) {
arr[i] = &i;
}
雖然它可能似乎是,該值指出,在該陣列將如下所示低 - [0,1,2,3],但實際上它會是[4,4,4,4],因爲你實際上有一個指針數組都指向你函數中的變量 i,所以每當你改變它時,數組中指向的值都將被改變。
我希望這有助於
爲什麼你將'void *'轉換爲'void *'? [你永遠不應該投它它。](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – 2013-04-20 19:08:18
'*(ARR + I)'無效指針解引用。 – BLUEPIXY 2013-04-20 19:10:44