C语言栈结构代码异常:无法正确反转数组求排查
问题排查与修复
你的代码核心问题在于反转数组时的下标错误,导致数据没有被写入到array_back的正确位置,甚至触发了数组越界的未定义行为。
具体原因分析
第一个for循环(用来把元素push进栈)结束后,变量i的值已经是6了(因为循环条件是i < 6,最后一次循环后i自增到6)。接下来的while循环直接用i++作为array_back的下标,这会把栈中pop出来的元素写到array_back[6]、array_back[7]这些超出数组范围的位置——但array_back的有效下标只有0到5(共6个元素)。
同时,while循环里的i < 10完全多余,既不符合数组长度,还可能导致更多越界问题。
修复方案
在进入while循环前,把i重置为0,让反转后的元素从array_back[0]开始写入:
int main() { int i; int array_back[6]; stack stack_to_build; int numbers[] = {4, 5, 6, 7, 8, 9}; print_array_values(numbers, 6); reset(&stack_to_build); for(i = 0; i < 6; i++) { push(&stack_to_build, numbers[i]); } // 重置i为0,开始填充反转数组 i = 0; while(!is_empty(&stack_to_build)) { array_back[i++] = pop(&stack_to_build); } printf("reverse is:\n"); print_array_values(array_back, 6); return 0; }
额外优化建议(可选)
为了让栈操作更健壮,建议在push和pop时增加栈满/栈空的检查,避免非法操作:
- 完善
push函数:
void push(stack* stk, int a) { if (is_full(stk)) { fprintf(stderr, "栈已满,无法执行push操作\n"); return; } stk->top++; stk->data[stk->top] = a; }
- 完善
pop函数:
int pop(stack* stk) { if (is_empty(stk)) { fprintf(stderr, "栈已空,无法执行pop操作\n"); return -1; // 这里可以根据需求定义错误返回值 } return stk->data[stk->top--]; }
内容的提问来源于stack exchange,提问作者Pawlos Gher
相关产品推荐
相关产品推荐

