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

栈操作程序报错‘数组下标非整数’:原因与修复方案咨询

解决“array subscript is not an integer”错误并修复栈实现问题

首先,咱们先搞清楚这个错误的含义:“array subscript is not an integer” 意思是你在数组下标位置使用的不是整数类型的值。在你的代码里,这个问题的核心是你把函数名top当成了整数变量来用,导致编译器无法将它解析为数组下标需要的整数。

接下来咱们一步步拆解你的代码问题,然后给出修复方案:

核心错误原因

你定义了一个名为top()的函数,但在isstackempty()、isstackfull()、pop()、push()这些函数里,又直接用top作为整数变量(比如if(top == -1)、stack[top])。此时编译器会把top识别为函数标识符,而不是整数变量,当你用它作为数组下标时,自然会抛出“下标不是整数”的错误。

其他需要修复的问题

除了这个核心错误,你的代码还有不少逻辑和语法问题:

  • 没有声明用于跟踪栈顶位置的全局变量top(你现在用的stackTop完全没起到正确的作用)
  • pop()函数的参数和返回值逻辑混乱:函数声明需要int *val参数,但你在main()里调用时没传参数;而且你试图把数组元素赋值给指针变量,这也不对
  • isstackfull()的判断逻辑错误:你的栈数组是int stack[10],下标范围是0-9,所以栈满的条件应该是top == DEFAULT_STACK_SIZE - 1,而不是等于DEFAULT_STACK_SIZE
  • top()函数的实现错误:当前返回的是*stackTop(指向一个固定的mockUp变量),而不是真正的栈顶元素
  • 部分函数缺少返回值:比如pop()和push()声明为int类型,但有些分支没有返回值,这会导致未定义行为
  • stack.h里的函数声明和stack.c里的实现不匹配:比如pop()在头文件里是int pop(int* val),但你在main()里用的是pop()无参调用

修复后的完整代码

stack.h

#define DEFAULT_STACK_SIZE 10
extern int isstackempty();
extern int isstackfull();
extern int top();
extern int pop(); // 修改为无参,直接返回弹出的值
extern int push(int val);
// 原头文件里未实现的函数暂时注释
// extern void setStackSize(int size);
// extern void getStackSize();
// extern void deleteStack();

stack.c

#include <stdlib.h>
#include <stdbool.h>
#include <stdio.h> // 加入stdio.h,因为要用printf
#include "stack.h"

// 声明跟踪栈顶位置的全局变量,初始为-1表示空栈
static int top = -1;
static int stack[DEFAULT_STACK_SIZE]; // 直接用宏定义的大小

int isstackempty() {
    return (top == -1) ? 1 : 0;
}

int isstackfull() {
    // 栈数组下标从0开始,满的条件是top等于最大下标
    return (top == DEFAULT_STACK_SIZE - 1) ? 1 : 0;
}

int top() {
    if (!isstackempty()) {
        return stack[top];
    } else {
        printf("Error: Stack is empty, no top value.\n");
        return -1; // 返回一个错误标记值
    }
}

int pop() {
    if (!isstackempty()) {
        int val = stack[top];
        top--;
        printf("%d popped from stack\n", val);
        return val;
    } else {
        printf("Error. Could not pop value as stack is empty.\n");
        return -1; // 返回错误标记
    }
}

int push(int val) {
    if (!isstackfull()) {
        top++;
        stack[top] = val;
        printf("%d pushed onto stack\n", val);
        return 0; // 返回0表示成功
    } else {
        printf("%d could NOT be pushed as stack is full.\n", val);
        return -1; // 返回-1表示失败
    }
}

int main() {
    push(1);
    push(2);
    push(3);
    push(4);
    push(5);
    push(6);
    push(7);
    push(8);
    push(9);
    push(10); // 测试栈满的情况
    push(11);

    printf("Value at top of stack is %d\n", top());

    while (!isstackempty()) {
        int val = pop();
        printf("Stack value popped %d\n", val);
    }
    // 测试空栈弹出
    pop();

    return 0;
}

修复后的逻辑说明

  1. 新增了全局变量int top,初始值为-1,用来跟踪栈顶的下标位置:
    • 当top == -1时,栈为空
    • 当top == DEFAULT_STACK_SIZE -1时,栈已满
  2. 重新实现了top()函数,现在它会返回栈顶的实际元素(栈空时返回错误标记并提示)
  3. 修改了pop()函数为无参,直接返回弹出的值,逻辑更清晰
  4. 修正了isstackfull()的判断条件,匹配数组的实际下标范围
  5. 给所有有返回值的函数补充了所有分支的返回值,避免未定义行为
  6. 加入了stdio.h头文件,因为你的代码里用到了printf,之前没包含会导致编译警告或错误

现在编译运行修复后的代码,应该就能正常工作,不会再出现“array subscript is not an integer”的错误了。

内容的提问来源于stack exchange,提问作者VK32154

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:42:29