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

C 語言 memset 函數詳解:跨平台行為差異與正確用法

     編輯:關於C語言

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 取得完整大小 */

⚠️ 關鍵陷阱:字元常數 vs 整數值


char a[10];
memset(a, '0', 5);  /* 填充 ASCII '0' (0x30),非數值 0 */
memset(a, 0, 5);    /* 正確清零:填充 0x00 */

輸出差異說明:

  • Windows:若以 %s 印出 memset(a,'0',5) 會顯示 00000(字元 '0')
  • Linux:同樣顯示 00000,但若填充 0 則為空字串(遇 \0 結束)

兩平台行為一致,差異僅在觀察方式。核心原則:memset 操作的是位元組,非字元或整數。

進階用法與注意事項

  1. 非 0/-1 填充整數陣列無效:memset(arr, 1, sizeof(arr)) 會使每個 int 變成 0x01010101 (16843009),非 1。需用迴圈或 std::fill (C++)。
  2. 類別物件慎用:含虛函數表指標、非 POD 成員的物件不可用 memset,會破壞物件語意。
  3. 效能優化:編譯器常將 memset(ptr, 0, n) 優化為向量化指令或 rep stosb,極高效。

最佳實踐總結

  • 清零 POD 結構體/陣列:memset(p, 0, sizeof(*p))
  • 填充字元緩衝區:memset(buf, ' ', size)
  • C++ 偏好 std::fill、std::fill_n、std::array::fill(),型別安全且通用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved