size_t(無號整數)。sizeof int 或 sizeof(x) 皆合法,後者不求值表達式(不執行 x)。int a[100];
int *p = a;
printf("%zu %zu\n", sizeof(a), sizeof(p)); // 400 8 (64位系統)
sizeof(a) = 整個陣列大小 (100*4)。sizeof(p) = 指標大小 (4/8),無法得知指向記憶體大小。int a[100];
memset(a, 0, 100); // 錯!第三參數是位元組數,僅清前 100 bytes (25 個 int)
memset(a, 0, sizeof(a)); // 正確:400 bytes
memset 按位元組填充,0 適用於整數/指標清零,但非 0 值不可用於整數陣列(會逐位元組填充,如 0x01010101)。memset 非 0 會產生非預期位模式。void *memcpy(void *dest, const void *src, size_t n) {
if (!dest || !src) return NULL; // 空指標防護
unsigned char *d = (unsigned char*)dest;
const unsigned char *s = (const unsigned char*)src;
// 處理記憶體重疊:向前/向後複製策略
if (d < s) {
while (n--) *d++ = *s++; // 低址→高址,安全
} else if (d > s) {
d += n; s += n;
while (n--) *--d = *--s; // 高址→低址,避免覆蓋未讀資料
}
return dest;
}
memmove 必須正確處理重疊,memcpy 標準未定義行為(但通常同向複製)。n >= 0。memset(&st, 0, sizeof(st)) 或 st = (typeof(st)){0} (C99 指定初始化器)。dst = src (編譯器生成最優複製) 優於 memcpy。sizeof(*ptr) * count 而非硬編碼型別大小。memset/memcpy(破壞 vptr)。掌握 sizeof 語義、memset 位元組語義與 memcpy 重疊處理,是寫出正確、高效、安全 C 記憶體操作代碼的基石。