2016-01-07 244 views
1

我有一個2D數組,需要將一個1D元素複製到一個數組中。 我試圖在下面的例子中重複我的問題。但是,下面的例子甚至不編譯,gcc抱怨複製1d元素2d陣列

下標值既不是數組,也不pointer`

在行TwoDArray[9][99] = 99;,這是爲什麼?我不太明白,任何幫助將不勝感激!

int main(void) 
{ 
    int i = 0; 
    int* TwoDArray; 
    int DestArr[100] = {0}; 

    TwoDArray = calloc(10,sizeof(int*)); 
    for (i = 0; i < 10; i++) 
    TwoDArray[i] = calloc(100,sizeof(int)); 

    TwoDArray[9][99] = 99; 

    memcpy(DestArr, &TwoDArray[9],sizeof(int)*100); 
    printf("DestArr[99] %d\n",DestArr[99]); 


return 0; 
} 

EDIT1:

我錯誤地沒有申報int** TwoDArray爲指針的指針 - 這個變化之後,它現在編譯完美,但在我的結果值0和我d期望它是99 - 這是爲什麼?

+1

int *不是二維數組或指針。 –

+0

箍,在我的問題中的錯誤...讓mer編輯,對不起! – cerr

+1

變化到'INT ** TwoDArray;'...'的memcpy(DestArr,TwoDArray [9],的sizeof(int)的* 100);' – BLUEPIXY

回答

1

在您的代碼中,TwoDArray是一個指針,指向一個int

因此,內存分配應該像

TwoDArray = calloc(10,sizeof(*TwoDArray)); //i.e., sizeof(int) 

,而不是

TwoDArray = calloc(10,sizeof(int*)); 

TwoDArray[i]存在int型的,不需要任何malloc -ation,任何責任。

所以,你可以使用TwoDArray[i],提供i是範圍之內。

TwoDArray[9][99]是無效的,如TwoDArray[9]不是指針,無論如何。

相關,使用數組下標操作者,

postfix-expression [ expression ]

一個表達式的應有類型「」指針來完成對象類型「」,另一 表達應具有整數類型,並且結果的類型是''type''。

如果是TwoDArray[9][99],TwoDArray[9]肯定不是指向完整對象類型的指針。


編輯:

如果您在使用

int** TwoDArray; 

TwoDArray[i] = calloc(100,sizeof(int)); 

然後,你需要改變

memcpy(DestArr, &TwoDArray[9],sizeof(int)*100); 

memcpy(DestArr, TwoDArray[9],sizeof(int)*100); 
       ^^ 

TwoDArray[9]本身現在是你感興趣的,而不是指針的地址指針。

+0

你可以欺騙,並把它當作指針'(INT *)(TwoDArray [9])[99]'。不建議 – SGM1

+0

其實,只是爲了爭論,我會說'TwoDArray [9]'是一個指針,被錯誤地解釋爲一個通用的數字。 – SGM1