代碼定義順序棧結構體 `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;
}