为何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
相关产品推荐
相关产品推荐

