实现简易生命游戏模拟器时cout输出触发中断错误求助
嘿,我一眼就揪出了问题的核心——动态数组的分配时机完全出错了,这直接引发了内存越界访问,最终触发了中断。让我一步步给你拆解清楚:
问题根源
你定义了全局变量cellNumber和cellTable:
int cellNumber; cell *cellTable = new cell[cellNumber];
在C++里,全局变量会被默认初始化为0,所以cellTable实际上被分配了一个大小为0的空数组。之后你在main函数里通过cellNumber = x*y修改了cellNumber的值,但这并不会改变cellTable已经分配好的数组大小!
接下来的嵌套循环里,你不断给cellTable[cellCounter]赋值,而cellCounter会从0增长到x*y-1,这完全超出了cellTable的实际大小(0),属于非法内存访问。这种未定义行为可能不会立刻报错,但会悄悄破坏内存结构,最终在你执行cout << result << endl时触发中断。
修复步骤
调整动态数组的分配时机:把
cellTable的分配移到cellNumber被正确赋值之后,也就是main函数里cellNumber = x*y这行代码之后:int main() { int x; int y; int cellCounter = 0; cin >> x >> y; cellNumber = x*y; // 在这里才分配符合需求的数组 cellTable = new cell[cellNumber]; cin >> numberOfTunrs; // ... 后续代码保持不变 }同时,把全局的
cellTable声明改成只声明不初始化:int cellNumber; cell *cellTable; // 先不分配内存避免内存泄漏:在程序结束前,别忘了释放动态分配的内存,比如在
main函数末尾加上:delete[] cellTable;额外优化提示:你的
countGroups函数里,checkingGroup + i可能会出现字符溢出的问题(比如当i超过25时,'A'+25是'Z',再往后就超出ASCII字母范围了),不过这不是当前中断的原因,后续可以优化这个逻辑。
为什么这能解决问题?
现在cellTable的大小和cellNumber完全匹配,循环里的数组访问都是合法的,不会再破坏内存结构,中断自然就消失了。
内容的提问来源于stack exchange,提问作者Magda Wolfii Krasucka

