2014-09-22 69 views
0

是否可以用C聲明二維數組,然後再設置它的大小?我知道在C中你必須處理記憶等事情,但儘管我全部搜索,但我仍無法找到這個問題的答案。設置二維數組,稍後更改大小 - C

我現在的例子是..

int boardsize, linewin; 
    char array[1][1]; 
    //boardsize is set within here. 

    array = [boardsize][boardsize]; 
+0

您將需要使用'malloc()'分配內存,並使用指向已分配內存的指針並將內存視爲二維數組。 – 2014-09-22 23:49:05

+0

請參閱http://stackoverflow.com/questions/13677566/malloc-a-2d-array-in-c,其中描述了該過程。和這一個以及http://stackoverflow.com/questions/1970698/using-malloc-for-allocation-of-multi-dimensional-arrays-with-different-row-lengt – 2014-09-22 23:50:15

+0

c是更多的機器導向和機器不會對此感到滿意。 – HuStmpHrrr 2014-09-23 00:47:49

回答

2

在C則需要使用指針做自己的動態數組管理。

請參閱以下文章,瞭解如何使用分配的內存區域進行操作。

Malloc a 2D array in C

Using malloc for allocation of multi-dimensional arrays with different row lengths

既然你正在尋找修改這些,你可能還需要使用realloc()功能或free()函數來釋放分配的內存。

有關使用realloc()函數的信息,請看下面的堆棧溢出。

Realloc double 2D array in C

two-dimensional dynamic array (realloc in c)

EDIT - 添加例如

這裏有兩個函數來malloc()的二維陣列和一個realloc()二維陣列。如果您將空指針傳遞給realloc2dCArray()以重新分配內存區域,則實際上可以使用realloc()版本。

我所試圖做的是使用一個單一的malloc()realloc()所有需要,讓您可以到free()單個呼叫free()這些內存中。

char **malloc2dCArray (int nRows, int nCols) 
{ 
    // use a single malloc for the char pointers to the first char of each row 
    // so we allocate space for the pointers and then space for the actual rows. 
    char **pArray = malloc (sizeof(char *) * nRows + sizeof(char) * nCols * nRows); 

    if (pArray) { 
     // calculate offset to the beginning of the actual data space 
     char *pOffset = (char *)(pArray + nRows); 
     int i; 

     // fix up the pointers to the individual rows 
     for (i = 0; i < nRows; i++) { 
      pArray[i] = pOffset; 
      pOffset += nCols; 
     } 
    } 

    return pArray; 
} 

char **realloc2dCArray (char **pOld, int nRows, int nCols) 
{ 
    // use a single realloc for the char pointers to the first char of each row 
    // so we reallocate space for the pointers and then space for the actual rows. 
    char **pArray = realloc (pOld, sizeof(char *) * nRows + sizeof(char) * nCols * nRows); 

    if (pArray) { 
     // calculate offset to the beginning of the actual data space 
     char *pOffset = (char *)(pArray + nRows); 
     int i; 

     // fix up the pointers to the individual rows 
     for (i = 0; i < nRows; i++) { 
      pArray[i] = pOffset; 
      pOffset += nCols; 
     } 
    } 

    return pArray; 
} 

要使用這些功能,你會做類似如下:

char **pChars = malloc2dCArray (16, 8); 
int i, j; 

for (i = 0; i < 16; i++) { 
    for (j = 0; j < 8; j++) { 
     pChars[i][j] = 0; 
    } 
} 

做一個realloc()你將要檢查realloc()工作得使用一個臨時變量,並在使用前檢查NULL它。

{ 
    char **pChars2 = realloc2dCArray (pChars, 25, 8); 
    if (pChars2) pChars = pChars2; 
} 

你也可以只使用realloc()版本,如果你提供了一個NULL指針,因爲realloc()會做malloc()如果指針到內存realloc()爲NULL。

我使用調試器對此進行了一些測試,看起來它對我有用。

+0

我開始明白你在說什麼。坦率地說,改變內存(alloc的內容)的想法起初對我來說似乎「壓倒性的」,而我無法找到一個簡單的例子,這裏有一個全局2d數組在上面聲明,這裏是我用輸入來編輯它的大小/變量。有沒有什麼辦法可以爲我編寫這段簡短的代碼片段並解釋它?所有其他的例子增加了更多的部分,我感到困惑。 – Austin 2014-09-23 20:18:40

+1

@奧斯汀,我會在今晚晚些時候看看,並告訴你。 – 2014-09-23 20:26:05

+0

這將不勝感激!謝謝! – Austin 2014-09-24 00:00:53