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

为何C语言离线游戏代码在数组空间充足时仍出现Runtime Failure #2及栈损坏错误?

解决栈损坏(Runtime Failure #2)的问题

我一眼就发现了导致你代码报错的核心问题——循环的边界计算错误,直接造成了数组越界访问,破坏了栈结构。

问题出在哪?

看这段循环代码:

for (int i = 0; i < sizeof(a); i++) {

你用sizeof(a)来判断循环结束条件,但sizeof(a)返回的是数组的总字节数。你的数组a是int[16],在大多数系统中int占4个字节,所以sizeof(a)的结果是16 * 4 = 64。这意味着你的循环会从i=0一直跑到i=63,但你的数组只有16个元素(索引范围是0~15)。

当i >= 16时,你还在往a[i]赋值,这就会写入数组之外的栈内存区域,直接破坏了栈中其他变量(比如player)或者栈帧的关键数据,触发了“变量周围的栈已损坏”的错误。

怎么修复?

你需要计算数组的元素个数,而不是总字节数。可以用sizeof(a)/sizeof(a[0])来得到数组的元素数量,这样循环就只会遍历数组的有效索引:

修正后的代码:

#include <stdio.h>
int main(void) {
    int a[16];
    int player = 32;
    // 用元素个数作为循环边界
    for (int i = 0; i < sizeof(a)/sizeof(a[0]); i++) {
        if (player+1 == i) {
            a[i] = 254;
        } else {
            a[i] = 32;
        }
    }
    printf("%d", a[15]);
    return 0;
}

sizeof(a)/sizeof(a[0])的计算逻辑是:总字节数除以单个元素的字节数,得到的就是数组的元素个数(这里是16),循环就会在i=15时结束,不会越界访问。

额外说明

你觉得“数组空间充足”是误解了循环的执行次数——你以为循环只跑16次,但实际上跑了64次,远远超出了数组的容量。数组越界在C语言中是未定义行为,有时候可能不会立刻报错,但一旦破坏了栈结构,就会触发这类运行时错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:27:42