You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 03:47:09