memset 是 <string.h> 中以「位元組為單位」填充記憶體的函數,原型:
void *memset(void *ptr, int value, size_t num);
它將 ptr 指向的前 num 個位元組全部設為 value(取低 8 位)。常用於字元陣列清零,但對整數陣列需極度小心。
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "HelloWorld";
printf("Before: %s\n", str);
memset(str, '*', strlen(str)); // 填充字元
printf("After : %s\n", str); // **********
int arr[5] = {1,2,3,4,5};
memset(arr, 0, sizeof(arr)); // 正確清零:0x00 位元組
// memset(arr, 1, sizeof(arr)); // ❌ 錯誤示範:每 byte=1 → 每 int=0x01010101=16843009
return 0;
}
memset(arr, 1, 5*sizeof(int)) 會把每個 int 的 4 個位元組都寫成 0x01,組成 0x01010101(十進制 16843009),不是你想要的 1。
| 填充值 | 位元組模式 | int 值 (小端) | 適用場景 |
|---|---|---|---|
| 0 | 0x00 0x00 0x00 0x00 | 0 | ✅ 安全清零 |
| -1 | 0xFF 0xFF 0xFF 0xFF | -1 (補碼全 1) | ✅ 設為 -1 |
| 任意非 0/-1 | 重複該 byte | 非預期值 | ❌ 禁用 |
for(int i=0;i —— 最直觀、無陷阱。 int a[5] = { [0 ... 4] = 42 }; (GCC 擴展) 或 int a[5] = {42,42,42,42,42};。std::fill(begin(arr), end(arr), VAL);。struct Node { int id; char name[32]; double score; };
struct Node node;
memset(&node, 0, sizeof(node)); // 所有成員歸零/空指標/0.0
結構體無填隙位元組時安全;若有 #pragma pack 或位元欄位,建議逐欄位初始化。
memset 只管位元組,字元清零最可靠;
整數陣列要賦值,迴圈逐個最安穩。
結構體清零可以用,填隙位元需留心。