首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言結構體指針參數傳遞:為什麼函數內修改指針指向不生效

     編輯:程式設計綜合問答

問題代碼

void Set(struct Process *L) {
    struct Process Demo;
    L = &Demo;  // 嘗試修改實參指向
    printf("%p\n", L);
}

int main() {
    struct Process *L = NULL;
    Set(L);
    if (L) { ... } else printf("L地址為NULL\n");  // 輸出 NULL
}

核心原因:指針按值傳遞

  • C 語言**只有值傳遞**。函數參數 L 是主調函數指針變量的**副本**。
  • 在 Set 內部 L = &Demo 只修改了**副本**指向棧上局部變量 Demo。
  • 函數返回後副本銷毀,主調函數的 L 仍指向 NULL。
  • 此外 Demo 是局部變量,函數返回後內存無效,即使修改成功也是懸空指針。

正確方案:二級指針 (指針的指針)

void Set(struct Process **L) {  // 接受指針地址
    struct Process *Demo = malloc(sizeof(struct Process));
    *L = Demo;  // 通過解引用修改主調指針指向
}

int main() {
    struct Process *L = NULL;
    Set(&L);  // 傳遞指針變量的地址
    // 此處 L 已指向新分配的內存
    free(L);  // 記得釋放
}

替代方案:返回新指針

struct Process* CreateProcess() {
    struct Process *p = malloc(sizeof(struct Process));
    return p;
}

int main() {
    struct Process *L = CreateProcess();
    // 使用 L
    free(L);
}

記憶口訣

「一級指針傳值,修改指向無效;二級指針傳址,修改指向生效;或直接返回新指針,簡單又安全。」

擴展:結構體指針作為參數的正確模式

需求參數類型示例
修改結構體成員struct Process *pp->age = 10; 生效
修改指針指向 (分配新內存)struct Process **p*p = malloc(...); 生效
僅讀取成員const struct Process *p防止誤修改
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved