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

C 語言結構體棧初始化報錯:指針未分配內存與參數傳遞錯誤

     編輯:程式設計疑難解答

錯誤代碼分析


SqStack *OPTR, *OPND; // 全局指針未初始化
int main() {
    InitStack(OPTR); // 傳遞未初始化的指針(野指針)
}
int InitStack(SqStack *S) {
    S->base = (SElemType*)malloc(...); // 解引用野指針 → 崩潰
}

核心問題

  1. 指針未分配內存:SqStack *OPTR 只是聲明指針變量,未指向有效 SqStack 結構體內存。
  2. 傳值調用無法修改指針本身:若在函數內 S = malloc(...),外部指針不變;需傳遞 **指針的指針** 或 **引用**(C++)。

修正方案(C 風格)

方案一:主調函數分配結構體,傳遞指針


int main() {
    SqStack OPTR, OPND; // 分配結構體對象
    InitStack(&OPTR);   // 傳遞地址
    InitStack(&OPND);
}
int InitStack(SqStack *S) { // S 已指向有效內存
    S->base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if (!S->base) return 0;
    S->top = S->base;
    S->stacksize = STACK_INIT_SIZE;
    return 1;
}

方案二:函數內分配結構體,返回指針


SqStack* CreateStack() {
    SqStack *S = (SqStack*)malloc(sizeof(SqStack));
    if (!S) return NULL;
    S->base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if (!S->base) { free(S); return NULL; }
    S->top = S->base;
    S->stacksize = STACK_INIT_SIZE;
    return S;
}
int main() {
    SqStack *OPTR = CreateStack();
    SqStack *OPND = CreateStack();
}

結構體含指針成員的深層複製陷阱

若 SElemType 含 char *str,malloc 只分配結構體本身,**不會自動為成員指針分配內存**。使用前必須單獨 malloc 並 strcpy,銷毀時先 free 成員再 free 結構體。

總結

  • 指針聲明 ≠ 內存分配,兩步驟缺一不可。
  • 函數修改指針指向需傳 ** 或返回新指針。
  • 結構體內指針成員生命周期需手動管理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved