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

memset vs NULL:指標初始化與記憶體清零的本質區別

     編輯:關於C語言

核心區別

操作作用對象效果典型用途
memset(ptr, 0, size)指標**指向的記憶體區塊**將內容逐位元組設為 0結構體/陣列清零、緩衝區初始化
ptr = NULL**指標變數本身**指標值設為 0(空指標)釋放後防野指標、延遲初始化標記

常見誤區

struct Node *p = malloc(sizeof(Node));
memset(p, 0, sizeof(Node)); // 正確:清零結構體內容
p = NULL;                   // 錯誤時機:這裡會導致記憶體洩漏(未 free 就丟失位址)

free(p);
p = NULL;                   // 正確:free 後置 NULL,防雙重釋放/野指標

結構體巢狀指標釋放規則

一個 malloc 對應一個 free。若結構體內含指標指向另一塊 malloc 記憶體,必須**先 free 內層指標,再 free 結構體本身**,否則內層記憶體洩漏。

全域指標初始化

static char *global_ptr = NULL; // 編譯期自動置 0,非野指標
// 等價於
static char *global_ptr;        // .bss 區自動零初始化

記憶體視角

  • NULL 只是位址 0x0,不映射任何有效儲存單元
  • 野指標指向隨機位址,解參考會竄改關鍵資料
  • memset 操作的是**資料區**,ptr=NULL 操作的是**指標變數本身**
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved