C语言栈仅能存入3个元素?动态内存分配异常求助
问题排查与修复
你的核心问题出在IsFull()函数的sizeof()使用错误,同时代码还有两处小问题,逐一说明:
1. 最多只能Push3个元素的根本原因
在IsFull函数中,你用sizeof(s->stack) / sizeof(int)判断栈是否已满,但s->stack是指针类型,不是数组。在64位系统中,指针大小为8字节,sizeof(int)为4字节,计算结果是2。而栈的sp初始值是-1:
- Push第1个元素:sp从-1变为0
- Push第2个元素:sp变为1
- Push第3个元素:sp变为2
此时IsFull判断sp == 2,返回TRUE,后续Push会提示栈溢出,这就是最多只能Push3个元素的原因。
解决方法是在Stack结构体中新增成员存储栈的长度,用这个长度来判断栈是否已满。
2. 其他两处错误
(1)EmptyStack函数的内存分配判断错误
你当前判断s == NULL,但s是传入的结构体指针,不可能为空,应该判断calloc的返回值s->stack == NULL:
if (s->stack == NULL) { printf("Insufficient Memory"); exit(0); }
(2)Display函数的空栈判断错误
当前条件if (s->sp < 1)会导致栈中有1个元素(sp=0)时仍显示“栈空”,应改为判断sp == -1:
if (s->sp == -1) { printf("Stack is empty\n"); }
修复后的完整代码
#include <stdio.h> #include <stdlib.h> typedef enum { FALSE, TRUE } Boolean; // 新增length成员存储栈的长度 typedef struct a { int *stack; int sp; int length; } Stack; int IsEmpty(Stack *s) { return (s->sp == -1) ? TRUE : FALSE; } // 使用结构体中存储的length判断栈满 int IsFull(Stack *s) { return (s->sp == s->length - 1) ? TRUE : FALSE; } void Push(Stack *s) { int num; if (IsFull(s)) { printf("Stack Overflow\n"); } else { s->sp++; printf("Enter the Element:"); scanf("%d", &num); s->stack[s->sp] = num; } } void Pop(Stack *s) { if (IsEmpty(s)) { printf("Stack Underflow\n"); } else { s->sp--; } } void Peek(Stack *s) { if (IsEmpty(s)) { printf("Stack is empty\n"); return; } printf("The Element at the peak is %d\n", s->stack[s->sp]); } void Display(Stack *s) { if (s->sp == -1) { printf("Stack is empty\n"); } else { for (int i = 0; i <= s->sp; i++) { printf("The element at the index %d is %d\n", i, s->stack[i]); } } } int Option() { int opt; printf("\nSelect Option\n\n1.Push\n2.Pop\n3.Peek\n4.Display\n5.Exit\n"); scanf("%d", &opt); return opt; } void EmptyStack(Stack *s) { int ln; s->sp = -1; printf("Enter the length of stack : "); scanf("%d", &ln); s->length = ln; // 保存栈的长度到结构体 s->stack = (int *)calloc(ln, sizeof(int)); if (s->stack == NULL) { printf("Insufficient Memory"); exit(0); } else { printf("Memory Allocated Successfully\n"); } } int main() // 标准C中main返回int,不是void { int opt; Stack s; EmptyStack(&s); while (1) { opt = Option(); switch (opt) { case 1: Push(&s); break; case 2: Pop(&s); break; case 3: Peek(&s); break; case 4: Display(&s); break; case 5: exit(0); default: printf("Invalid Choice\n"); break; } } return 0; }
内容的提问来源于stack exchange,提问作者Fameless
相关产品推荐
相关产品推荐

