memset 用於以指定位元組值填充記憶體區塊,是大型結構體或陣列清零的最高效方法。
#include <string.h>
void *memset(void *s, int c, size_t n);
s:目標記憶體起始位址c:填充值(以 unsigned char 解釋,僅取低 8 位)n:填充位元組數s
struct Data { int a; double b; char buf[100]; } d;
memset(&d, 0, sizeof(d)); /* 正確:sizeof 取得完整大小 */
char a[10];
memset(a, '0', 5); /* 填充 ASCII '0' (0x30),非數值 0 */
memset(a, 0, 5); /* 正確清零:填充 0x00 */
輸出差異說明:
%s 印出 memset(a,'0',5) 會顯示 00000(字元 '0')00000,但若填充 0 則為空字串(遇 \0 結束)兩平台行為一致,差異僅在觀察方式。核心原則:memset 操作的是位元組,非字元或整數。
memset(arr, 1, sizeof(arr)) 會使每個 int 變成 0x01010101 (16843009),非 1。需用迴圈或 std::fill (C++)。memset,會破壞物件語意。memset(ptr, 0, n) 優化為向量化指令或 rep stosb,極高效。memset(p, 0, sizeof(*p))memset(buf, ' ', size)std::fill、std::fill_n、std::array::fill(),型別安全且通用