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);
記憶體管理黃金法則