代碼:
char a[] = "hello"; // 實際為 {'h','e','l','l','o','\0'} 長度 6
char b[5] = {0}; // 5 個 0
// 內存佈局 (棧上連續分配,b 在低地址,a 在高地址):
// b[0] b[1] b[2] b[3] b[4] a[0] a[1] a[2] a[3] a[4] a[5]
// 0 0 0 0 0 h e l l o \0
for (int i = 0; i < 5; ++i) b[i] = a[i]; // 複製 'h','e','l','l','o' 到 b
// 內存變為:
// h e l l o h e l l o \0
// b[0]...b[4] a[0]...a[5]
printf("%s", b); // 從 b[0] 尋找 '\0',發現於 a[5] 位置 → 輸出 "hellohello"
a 包含結束符 \0 (長度 6);b 長度 5,**無結束符空間**。b 低地址,a 高地址 (編譯器實現相關,但通常連續)。i=0..4 複製 a[0..4] ('h'..'o') 到 b[0..4]。**未複製 a[5] (\0)**。b 變為 "hello" (無 \0),緊接著是 a 的 "hello\0"。整個連續區無 \0 直到 a 末尾。%s 從 b 起始地址尋找首個 \0,跨過 b 5 字節、a 前 5 字節,在 a[5] 找到 → 輸出 10 字符 "hellohello"。
// 1. 留出結束符空間
char b[6] = {0};
// 或
char b[sizeof(a)]; // 自動匹配大小
// 2. 複製包含結束符
strcpy(b, a); // 安全、標準
// 或
memcpy(b, a, sizeof(a)); // 精確複製 6 字節
// 或循環
for (int i = 0; i < sizeof(a); ++i) b[i] = a[i];
strcpy/strncpy/memcpy 等標準庫函數,避免手寫循環漏掉 \0。