栈操作程序报错‘数组下标非整数’:原因与修复方案咨询
解决“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_SIZEtop()函数的实现错误:当前返回的是*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; }
修复后的逻辑说明
- 新增了全局变量
int top,初始值为-1,用来跟踪栈顶的下标位置:- 当
top == -1时,栈为空 - 当
top == DEFAULT_STACK_SIZE -1时,栈已满
- 当
- 重新实现了
top()函数,现在它会返回栈顶的实际元素(栈空时返回错误标记并提示) - 修改了
pop()函数为无参,直接返回弹出的值,逻辑更清晰 - 修正了
isstackfull()的判断条件,匹配数组的实际下标范围 - 给所有有返回值的函数补充了所有分支的返回值,避免未定义行为
- 加入了
stdio.h头文件,因为你的代码里用到了printf,之前没包含会导致编译警告或错误
现在编译运行修复后的代码,应该就能正常工作,不会再出现“array subscript is not an integer”的错误了。
内容的提问来源于stack exchange,提问作者VK32154
相关产品推荐
相关产品推荐

