2014-01-07 145 views
1

我有一些理解指針和動態內存分配的麻煩。我寫了這2碼:動態內存分配 - 二維數組

int **array; 
    array = malloc(nrows * sizeof(int *)); 
    if(array == NULL) 
    { 
     fprintf(stderr, "out of memory\n"); 
     return -1; 
    } 
     for(i = 0; i < nrows; i++) 
    { 
     *(array+i) = malloc(ncolumns * sizeof(int)); 
     if(array[i] == NULL) 
     { 
      fprintf(stderr, "out of memory\n"); 
      return -1; 
     } 
    } 

和:

int **array; 
    array = malloc(nrows * sizeof(int *)); 
    if(array == NULL) 
    { 
     fprintf(stderr, "out of memory\n"); 
     return -1; 
    } 
     for(i = 0; i < nrows; i++) 
    { 
     array[i] = malloc(ncolumns * sizeof(int)); 
     if(array[i] == NULL) 
     { 
      fprintf(stderr, "out of memory\n"); 
      return -1; 
     } 
    } 

他們應該分配的二維數組空間。雖然林不知道如果theyre都正確,我的意思是:這是否行:

array[i] = malloc(ncolumns * sizeof(int));

做同樣的事行這一個:

*(array+i) = malloc(ncolumns * sizeof(int));

+1

這是一個很多malloc'ing。爲什麼不把整個數據集的1個malloc放在int *數組中? array = malloc(nrows * ncolumnc * sizeof()),由數組[x * nrows + y]或數組[x + ncolumns * y]引用。你的最後一個問題是正確的,他們是一樣的,儘管第一行看起來更清晰。 – EkriirkE

回答

2

這兩個*(array + i)array[i]評估爲相同的事情(假設一個是指針,另一個是整數)。爲了你的理智和其他人,使用第二種形式;它會更容易閱讀和維護。

如果您在編譯時知道你的陣列尺寸的大小,如果您正在使用支持變長數組一個編譯器,則可以簡化這個有點:

int (*array)[ncols] = malloc(sizeof *array * nrows); 

這將爲nrows x ncols陣列int分配足夠的內存。如果您使用的編譯器不支持可變長度數組,則編譯時必須知道ncols(即,它必須是宏或其他編譯時常量)。你會訪問數組元素,就像對任何普通2D陣列:

array[i][j] = x; 

一個優點這種方法比兩步法是,所有的內存分配連續;也就是說,所有的行都將在內存中相鄰。如果要將數組視爲單個連續的數據塊(例如,如果您通過系統調用write通過套接字發送數據),這可能很重要。採用兩步法,並不能保證所有的行都會相鄰。

的另一個優點是,解除分配僅需要到free單個呼叫:

free(array); 
3

是的。

array[i],*(array+i)i[array]被編譯器視爲相同的東西。

+0

'我[陣列]'?你確定? – egur

+3

是的。親自嘗試一下。 –

+0

@egur'array [i]'和'i [array]'是一樣的。如果你重寫它們,你會發現它們分別與'*(array + i)'和'*(i + array)'相同。 –

2

是的,當你編譯你的代碼時,它們都應該被視爲相同。

1
int **array; 
array = malloc(nrows * sizeof(int *)); 

變量數組的指針或雙指針變量的陣列。這些指針的值都在下一數組分配完成:

array[i] = malloc(ncolumns * sizeof(int)); or 
*(array+i) = malloc(ncolumns * sizeof(int)); 

array [i] ==> i是陣列女巫的索引包含由malloc(ncolumns * sizeof(int));

*(array + i)分配的指針的值==>是偏移量使用解析陣列和陣列* + i)爲指針的由malloc(ncolumns * sizeof(int));

所以

array[i] = malloc(ncolumns * sizeof(int)); 
and 
*(array+i) = malloc(ncolumns * sizeof(int)); 
分配的值10

完全一樣