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

C語言memset函數詳解:用法、陷阱與正確初始化姿勢

     編輯:關於C語言

C語言 memset 函數詳解:用法、陷阱與正確初始化姿勢

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 值 (小端)適用場景
00x00 0x00 0x00 0x000✅ 安全清零
-10xFF 0xFF 0xFF 0xFF-1 (補碼全 1)✅ 設為 -1
任意非 0/-1重複該 byte非預期值❌ 禁用

正確初始化整數陣列的替代方案

  1. 迴圈賦值:for(int i=0;i —— 最直觀、無陷阱。
  2. 複合字面量 (C99):int a[5] = { [0 ... 4] = 42 }; (GCC 擴展) 或 int a[5] = {42,42,42,42,42};。
  3. 標準庫算法 (C++):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 只管位元組,字元清零最可靠;
整數陣列要賦值,迴圈逐個最安穩。
結構體清零可以用,填隙位元需留心。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved