C 語言二級指標間接賦值詳解:函數內分配記憶體並返回給呼叫者
三個條件
- 呼叫端有實際指標變數 (一級指標)。
- 被呼叫端參數為二級指標,建立關聯:
func(&ptr)。
- 被呼叫端透過解參考修改實際指標值:
*ptr = malloc(...)。
完整範例:動態分配兩字串
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int get_mem(char **p1, int *len1, char **p2, int *len2) {
char *tmp1 = malloc(100);
if (!tmp1) return -1;
strcpy(tmp1, "1234456789");
*len1 = strlen(tmp1);
*p1 = tmp1; // 間接賦值
char *tmp2 = malloc(200);
if (!tmp2) { free(tmp1); return -2; }
strcpy(tmp2, "abcdefghijklmn");
*len2 = strlen(tmp2);
*p2 = tmp2;
return 0;
}
void free_mem(char **p) {
if (p && *p) { free(*p); *p = NULL; }
}
int main() {
char *s1 = NULL, *s2 = NULL;
int l1, l2;
if (get_mem(&s1, &l1, &s2, &l2) == 0) {
printf("s1: %s (len=%d)\n", s1, l1);
printf("s2: %s (len=%d)\n", s2, l2);
free_mem(&s1);
free_mem(&s2);
}
return 0;
}
記憶體圖解
main: s1 ──────┐
│
get_mem: *p1 ──┼──> [heap] "1234456789"
│
└── s1 現在指向該記憶體
常見錯誤
- 忘記傳
&s1,導致修改副本。
malloc 失敗不檢查,後續解參考崩潰。
- 釋放時未將指標設為
NULL,產生野指標。
應用場景
- 函數需返回多個動態分配物件。
- 輸出參數為指標、結構體指標、陣列指標。
- C 語言模擬「引用傳遞」的標準模式。