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

C 語言順序棧實現階乘:指針未初始化導致的經典崩潰

     編輯:程式設計綜合問答

錯誤現場

代碼定義順序棧結構體 `SeqStack`,主函數中聲明 `SeqStack *S;` 直接傳遞給 `Init_SeqStack(S)`,隨後在初始化函數中執行 `S->top = -1;` 導致段錯誤/訪問違規。

根本原因

SeqStack *S; 僅在棧上分配了一個野指針,指向隨機地址。未對其分配內存(`malloc`)或指向合法對象,直接解引用寫入自然崩潰。

修正方案

int main() {
    int n, f;
    SeqStack *S = (SeqStack *)malloc(sizeof(SeqStack)); // 關鍵:分配內存
    if (!S) return -1;
    printf("input n:\n");
    scanf("%d", &n);
    printf("%d\n", fact(n, f, S));
    free(S); // 記得釋放
    getch();
    return 0;
}

或在棧上分配實例,傳遞地址:
SeqStack S; fact(n, f, &S); 並將所有函數參數改為 `SeqStack *`。

順序棧完整可運行實現

#include 
#include 

#define MAX_SIZE 50

typedef struct {
    int data[MAX_SIZE];
    int top;
} SeqStack;

void init(SeqStack *s) { s->top = -1; }
int is_full(SeqStack *s) { return s->top == MAX_SIZE - 1; }
int is_empty(SeqStack *s) { return s->top == -1; }

void push(SeqStack *s, int v) {
    if (is_full(s)) exit(EXIT_FAILURE);
    s->data[++s->top] = v;
}
int pop(SeqStack *s) {
    if (is_empty(s)) exit(EXIT_FAILURE);
    return s->data[s->top--];
}

long long fact_stack(int n) {
    SeqStack s; init(&s);
    for (int i = n; i > 0; --i) push(&s, i);
    long long res = 1;
    while (!is_empty(&s)) res *= pop(&s);
    return res;
}

int main() {
    int n; scanf("%d", &n);
    printf("%lld\n", fact_stack(n));
    return 0;
}

核心知識點

  • 指針變量本身佔用內存(4/8 字節),聲明後必須指向有效內存才能使用。
  • 函數參數傳遞結構體指針時,調用者負責確保指針有效(分配或取址)。
  • 棧內存自動管理,堆內存手動管理,混用時注意生命週期。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved