首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言二維字符陣列快速初始化:memset 與複合字面量最佳實踐

     編輯:C 語言問答

問題場景


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; pmemset 只能填 0/-1
結構體陣列初始化指定初始化子 ={.field=val} + 迴圈避免填充位元組干擾
編譯期常量大陣列靜態存儲 + 指定初始化子 (GCC 擴展或腳本生成)零運行期開銷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved