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

C 語言二級指標間接賦值詳解:函數內分配記憶體並返回給呼叫者

     編輯:關於C語言

C 語言二級指標間接賦值詳解:函數內分配記憶體並返回給呼叫者

三個條件

  1. 呼叫端有實際指標變數 (一級指標)。
  2. 被呼叫端參數為二級指標,建立關聯:func(&ptr)。
  3. 被呼叫端透過解參考修改實際指標值:*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 語言模擬「引用傳遞」的標準模式。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved