2012-09-14 93 views
0

我試圖讓C中的數組的深層副本(originalBoard爲複製):在C ... malloc中深度複製數組?

int gy, gx;   
      for (gy=0; gy<9; gy++) 
      { 
       for (gx=0; gx<9; gx++) 
       {     
       g.originalBoard[gy][gx]=g.board[gy][gx]; 
       } 
      } 

這似乎並不奏效了,我猜這只是把指針原來的電路板陣列。

那麼解決方案是嘗試使用malloc?像:

int* g.originalBoard[9][9]=malloc(sizeof(g.board[9][9])); 

btw這是一個9x9二維數組。語法是什麼(編譯器給出上述行的錯誤...)?

回答

2

我認爲你需要這樣的:

//assuming g.originalBoard is array of array of integers and same for g.board 
int *originalBoard = malloc(sizeof(g.board)); 
memcpy(originalBoard, g.board, sizeof(g.board)); 
+0

memcopy是他們走的路。我編輯了你的答案,因爲它需要sizeof(g.originalBoard),而不是g.board。我在這裏跳過了malloc函數,因爲我事先在一個結構中聲明瞭數組 – Live2Enjoy7

+0

@ Live2Enjoy7,因爲這是需要被複制的'g.board'。 – Rohan

0

這是正確的地方使用memcpy。你可能想

g.originalBoard = (int *)malloc(9 * 9 * sizeof(int)); 
if (NULL == g.originalBoard) { 
    /* malloc failed, so handle the error somehow */ 
} 
memcpy(g.originalBoard, g.board, 9 * 9 * sizeof(int)); 

你可能會注意到你必須使用g.board[r * 9 + c]索引訪問項目(R,C),而不是兩個指標上述溶液。這是因爲這種動態分配內存的方式 - 在編譯時g.boardg.originalBoard只是指針,而不是數組。另外,如果你有超過g類型的定義控制,可以硬編碼矩陣的大小

struct foo { 
    int board[9][9]; 
    int originalBoard[9][9]; 
    /* Other fields here */ 
}; 

然後,你就不必額外的malloc空間g.boardg.originalBoard - 這兩個領域會只要您爲g本身分配了空間,就會自動進行分配。此外,您可以使用g.board[r][c]而不是g.board[r * 9 + c]

+0

我看過memcpy之前,無所謂我複製整數數組不是一個字符串? – Live2Enjoy7

+0

@ Live2Enjoy7'memcpy'複製字節並且不關心這些字節包含的數據的類型,所以沒有關係你正在複製整數。 –

0

順便說一句,如果你想對陣列執行下面的 '預期' 的任務,

INT * g.originalBoard [9] [ 9] = malloc的(的sizeof(g.board [9] [9]));

則應上面的行改變爲

INT * g.originalBoard [8] [8] = malloc的(的sizeof(g.board [8] [8]));

因爲這是一個9x9的二維數組,並且在C數組中是基於零的。