2013-04-20 88 views
2

我有空隙的指針數組和想要訪問的元素(inititialize它們),但它不工作:無效指針數組

void* anyptr = ...; //a pointer to something 
void* arr = (void*)malloc(sizeof(void*)*10); 

int i=0; 
for(i=0; i<10; i++) 
    *(arr+i) = anyptr; //dont work, (arr+n) = anyptr; doesn´t work too 

我想,之所以這樣,不需額外工作在左邊是元素i的結果。但我不有一個想法如何做到這一點

+5

爲什麼你將'void *'轉換爲'void *'? [你永遠不應該投它它。](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – 2013-04-20 19:08:18

+0

'*(ARR + I)'無效指針解引用。 – BLUEPIXY 2013-04-20 19:10:44

回答

14

有兩種方法在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,所以每當你改變它時,數組中指向的值都將被改變。
我希望這有助於

8

您需要

void* arr = (void*)malloc(sizeof(void*)*10); 

改變這一行這一

void** arr = malloc(sizeof(void*)*10); 
+0

你能解釋爲什麼它被聲明爲一個指針指針? – init 2016-08-06 16:24:34

+1

@init因爲這就是你分配內存的原因:10個指針。你如何指向這個記憶?你指向第一個指針。因此,它是一個指針指針。你給它加1,然後你指向下一個指針,直到10個指針中的最後一個。 – 2016-08-06 22:02:49

1

你不能提領一空指針。這是void指針的全部。 解引用指針可讓您訪問在指針指向的地址處找到的項目。但是,使用void指針,您不知道目標對象有多大(是1B字符還是100B結構?)。在對其進行解引用之前,必須將其轉換爲特定的指針類型。

向指針添加(或減去)整數i然後定義爲向指針內容添加i-times sizeof(*指針)。 (如果你的指針有一個特定的類型,你只能告訴sizeof(*指針)。帶空指針的指針算術沒有任何意義)。 (arr + n)= anyptr,arr + n只是一個地址。這不是一個值,你可以分配一些東西(不是左值)。

+0

以及我如何更改地址arr + n的值? – 0xDEADBEEF 2013-04-20 19:55:17

+0

通過將其轉換爲特定的指針類型,然後對其進行解引用。但是,請注意,如果ptr是一個非空指針,那麼ptr + n將表示ptr之前的n個項,這並不意味着n個字節(它對char *指針是這樣做的,但對於int指針來說,它很可能意味着n * 4字節提前,對於指向任何類型指針的指針,它將意味着4 * n或8 * n,這取決於您的體系結構(分別爲32或64位)。 – PSkocik 2013-04-20 20:05:25