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

C 語言指標參數輸入輸出模式詳解:呼叫端與被呼叫端記憶體管理責任劃分

     編輯:關於C語言

C 語言指標參數輸入輸出模式詳解:呼叫端與被呼叫端記憶體管理責任劃分

模式一:輸出參數 (被呼叫端分配)

// 呼叫端
char *p1 = NULL, *p2 = NULL;
int len1, len2;
get_data(&p1, &len1, &p2, &len2); // 傳二級指標
// 使用 p1, p2...
free(p1); free(p2); // 呼叫端負責釋放

// 被呼叫端
int get_data(char **out1, int *len1, char **out2, int *len2) {
    char *tmp1 = malloc(100); strcpy(tmp1, "data1");
    *len1 = strlen(tmp1); *out1 = tmp1; // 間接賦值
    // ...
    return 0;
}
  • 適用:呼叫端不知所需大小、或被呼叫端封裝複雜分配邏輯。
  • 契約:被呼叫端分配,呼叫端釋放。

模式二:輸入參數 (呼叫端分配)

// 呼叫端
char buf[1024];
process(buf, sizeof(buf)); // 傳緩衝區指標與大小

// 被呼叫端
int process(char *buf, size_t size) {
    if (size < needed) return -1;
    strcpy(buf, "result");
    return 0;
}
  • 適用:固定大小緩衝區、效能敏感避免 malloc、呼叫端控制生命週期 (如棧上陣列)。
  • 契約:呼叫端分配並釋放。

模式三:輸入輸出參數 (呼叫端分配,被呼叫端修改)

void to_upper(char *str) { while(*str) *str++ = toupper(*str); }
// 呼叫端: char s[]="abc"; to_upper(s);

記憶體管理黃金法則

防洩漏模式

// 輸出參數統一釋放函數
void free_out(char **p) { if (p && *p) { free(*p); *p = NULL; } }

明確劃分責任,文件化契約,是 C 語言大型專案穩健的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
模式誰分配誰釋放典型用途
輸出CalleeCaller動態大小、工廠函數
輸入CallerCaller固定緩衝區、高效能
輸入輸出CallerCaller原地修改、字串處理