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

C 語言指標參數傳遞動態記憶體的正確姿勢

     編輯:關於C語言

錯誤示範:傳遞指標值無法修改呼叫端指標

void GetMemory(char *p, int num) { p = (char*)malloc(sizeof(char)*num); }
void Test() { char *str=NULL; GetMemory(str,100); strcpy(str,"hello"); } // str 仍為 NULL,崩潰

原因:參數 p 是指標的副本,函數內修改 p 指向的新記憶體,不影響外部 str。且每次呼叫洩漏記憶體。

正確做法一:指標的指標

void GetMemory2(char **p, int num) { *p = (char*)malloc(sizeof(char)*num); }
void Test2() { char *str=NULL; GetMemory2(&str,100); strcpy(str,"hello"); free(str); }

傳遞 &str,函數透過解參考修改原指標指向。

正確做法二:函數回傳值(推薦)

char *GetMemory3(int num) { return (char*)malloc(sizeof(char)*num); }
void Test3() { char *str = GetMemory3(100); strcpy(str,"hello"); free(str); }

語意清晰、呼叫端直觀,避免雙重指標複雜度。

陷阱:回傳區域陣列指標

char *GetString() { char p[]="hello world"; return p; } // 錯誤:p 在棧上,函數返回即銷毀

除錯器可見 str 非 NULL 但內容為亂碼。

正確:回傳字串常數指標

char *GetString2() { return "hello world"; } // 常數區,生命週期全程

雖能執行,但設計概念錯誤:回傳唯讀記憶體,呼叫端不可修改,且多次呼叫回傳同一地址。

總結

  1. 指標參數傳值,無法修改呼叫端指標本身。
  2. 需修改指標指向:用 ** 或回傳值。
  3. 嚴禁回傳棧上區域變數指標。
  4. 字串常數位於唯讀區,勿嘗試修改。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved