int a[5], b[5], i=0, j=0;
// ... 輸入 a 數組 ...
while(i < 5) {
a[i] = b[j]; // 錯誤賦值方向!
printf("%d", b[j]);
i++; j++;
}
現象:無法輸出 b[] 的值,因為 b 數組未初始化,全是垃圾值。
賦值運算符 = 方向是「從右向左」:
a[i] = b[j] 意為:將 b[j] 的值賦給 a[i]。b[j] 未賦值(未初始化的局部數組值不定),導致 a[i] 變成垃圾值,打印 b[j] 也是垃圾值。while(i < 5) {
b[i] = a[i]; // 正確:將 a[i] 賦給 b[i]
printf("%d ", b[i]);
i++;
}
memcpy(高效、推薦)#include <string.h> // 或 <stdlib.h>
// ...
memcpy(b, a, sizeof(a)); // 一次性拷貝整個數組
// 然後打印 b
for(i=0; i<5; i++) printf("%d ", b[i]);
sizeof(a) 在數組定義作用域內有效;若數組退化為指針傳入函數,需顯式傳遞長度。struct Arr5 { int v[5]; };
struct Arr5 sa = { .v = {1,2,3,4,5} }, sb;
sb = sa; // 結構體變量之間支持直接整體賦值!
// sb.v 即為拷貝結果
sizeof、&、_Alignof 外)會退化為指向首元素的指針,失去長度信息。b = a 這類整體賦值。memcpy/memmove:標準、高效、語義明確。memcpy(dest, src, n * sizeof(int))。strcpy/strncpy/strlcpy,注意結束符 \0。int b[5] = {0}; 或 int b[5] = {1,2,3,4,5}; 是初始化(允許列表),運行時只能逐元素或 memcpy。數組拷貝的核心是搞清數據流向:源數組 → 目標數組。原代碼 a[i]=b[j] 方向反了,且源數組 b 未初始化。掌握 memcpy、結構體包裹、循環拷貝三種姿勢,並理解數組退化機制,即可徹底避開此坑。