問題場景
char board[100][100] = {'M'}; // 錯誤:僅初始化 board[0][0],其餘為 0
// 編譯器警告:excess elements in scalar initializer
方案一:memset (最高效、通用)
#include <string.h>
char board[100][100];
memset(board, 'M', sizeof(board)); // 將所有位元組設為 'M' (0x4D)
// sizeof(board) = 100*100*sizeof(char) = 10000
- **原理**:
memset 按位元組填充,**字符類型單字節**,完美匹配。
- **注意**:不可用於
int/float/指標陣列 (非全 0/全 -1 時位元組模式不匹配)。
方案二:C99 複合字面量 + 迴圈 (語意清晰)
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
board[i][j] = 'M';
}
}
// 編譯器 -O2 會優化為 memset/mov 向量指令,效能相近
方案三:靜態初始化 (僅限編譯期常量)
// 僅適用於全域/靜態陣列,且值為常量表達式
static char board[100][100] = {
[0 ... 99] = { [0 ... 99] = 'M' } // GCC 擴展:指定範圍初始化
};
// 標準 C 不支援範圍語法,需手寫 100 行 { 'M', 'M', ... }
附帶問題:printf 單引號跳脫
// 錯誤
printf("Now it's A's turn...");
// 正確:雙引號包含單引號無需跳脫
printf("Now it's A's turn...");
// 或跳脫雙引號
printf("Now it\"s A\"s turn...");
// 字符常量中單引號需跳脫
char c = '\'';
總結選型表
| 場景 | 推薦方法 | 關鍵點 |
| 字符陣列全值初始化 | memset(arr, ch, sizeof(arr)) | 最快、最簡潔 |
| 整數陣列非 0 初始化 | 迴圈賦值或 for (int *p=arr; p | memset 只能填 0/-1 |
| 結構體陣列初始化 | 指定初始化子 ={.field=val} + 迴圈 | 避免填充位元組干擾 |
| 編譯期常量大陣列 | 靜態存儲 + 指定初始化子 (GCC 擴展或腳本生成) | 零運行期開銷 |