2012-01-08 10 views

回答

2

隨着你的定義AB,分配A[5] = B[4];是非法的。

可以很容易地通過替換每個元件一個一個

for (size_t i = 0; i < 10; i++) A[5][i] = B[4][i]; 

或,假設陣列是相同的基本類型的,使用memmove()(或memcpy()因爲數組不重疊)

#include <string.h> 
memmove(A[5], B[4], 10 * sizeof B[4][0]); 
// memcpy(A[5], B[4], 10 * sizeof B[4][0]); 
2

數組不可分配,所以你不能這樣做。

你有2種選擇:

  1. 循環通過陣列和單獨分配的每個元素。或
  2. 您可以使用memcpymemmove。這是可能的,因爲陣列,保證是在內存中連續這樣
1

您不能分配在C數組類型所以你要麼複製件明智的,或使用memcpy

-1

你不允許像這樣直接拷貝C數組,但是有一個解決方法。你可以換裏面struct

struct int_array_10 { 
    int x[10]; 
}; 

struct int_array_10 A[10]; 
struct int_array_10 B[10]; 

int main() { 
     A[5] = B[4]; // this works 
} 

這編譯和正確的陣列。但它可能有點不方便,因爲您知道必須使用類似A[3].x[4]而不是A[3][4]來訪問元素。也許你會定義一個宏訪問相反,允許讀取和更方便地寫元素:

#define get(a,X,Y) (a[X].x[Y]) 

,你可以使用此類似:

get(A,3,4) = get(B,7,8); 
+1

這是一個糟糕的解決方案,這導致了糟糕的編碼習慣,很難爲其他編碼人員維護。循環被引入到編程語言中是有原因的 – stdcall 2012-01-08 16:41:07

+0

強詞,@Mellowcandle。我沒有從你的評論中學到任何東西。 – 2012-01-08 16:50:32

+0

在這種情況下,循環是一個可怕的解決方案。使用memcpy會更好。編譯器可以正確地優化它,並且它更易於閱讀。 (是的,編譯器也可以優化一個簡單的循環 - 大多數情況下,但編譯器不能確信這樣做太容易了。) – ams 2012-01-08 21:09:41

0

C沒有真正的多維數組類似於一些其他語言。

C有數組數組。

在此聲明

int a[8][12];

aint陣列12的陣列8。

所以a[0][0]int類型和a[5]int類型的排列12的類型。

a[5]是一個數組,它不能用作賦值運算符的左操作數。 C將數組視爲二級公民,並且不能分配數組。

Ç說(從C99標準中引用):

(6.5.16p2) 「的賦值操作員有修改的左值作爲 其左操作數」

( 6.3.2.1p1)「一個可修改的左值是沒有陣列類型的左值,[...]」

要複製數組對象,使用方法是使用memcpy函數。

+0

downvoter,你能解釋爲什麼你downvoted? – ouah 2012-01-08 16:36:50

+0

(我不是downvoter)也許他們對「C沒有真正的多維數組」的陳述有異議。在像這樣的例子中,在編譯時已知維數的情況下,我認爲多維數組在C語言中工作得很好。例如,ith int a [8] [12];'沒有間接指針查找需要。 [另外,你並不是唯一一個得到贊同的答案,並不是不正確的:-)] – 2012-01-09 13:41:24

+0

@AaronMcDaid感謝您的評論。這也是我的猜測。實際上,我在*多維數組*之前將* real *這個詞放在答案中,以防止那些因爲這個陳述而倒下的人;) – ouah 2012-01-09 20:18:46