C++可变大小二维数组赋值异常问题求助
问题原因分析
核心问题:数组越界访问
这是ARRAY_SIZE设为20时出现异常的根本原因:
- 你声明的数组是
char map[ARRAY_SIZE-1][ARRAY_SIZE-1],意味着数组的有效索引范围是0到ARRAY_SIZE-2(C++数组索引从0开始,大小为N的数组最大索引是N-1)。 - 但初始化循环里用了
Xcord <= (ARRAY_SIZE-1)和Ycord <= (ARRAY_SIZE-1),会访问到map[ARRAY_SIZE-1][...]——这个位置超出数组内存边界,会破坏程序其他区域的内存数据。 - 打印函数
printMap中,循环条件是row <= size(size传入的是ARRAY_SIZE-1),同样会访问到row = ARRAY_SIZE-1的越界位置,读取到非法内存值,表现为打印时的缺失或乱码。
其他辅助错误
数组初始化逻辑冗余且有误
- 声明数组时
char map[ARRAY_SIZE-1][ARRAY_SIZE-1] = {'$'};只会把第一个元素设为$,其余元素默认初始化为空字符\0;后续循环本想覆盖所有元素,但越界操作反而破坏了内存。 - 赋值语句
map[Xcord][Ycord] = { '$' };写法多余,直接写map[Xcord][Ycord] = '$';即可。
- 声明数组时
打印函数参数与数组不匹配
printMap的参数char Bmap[ARRAY_SIZE-1][ARRAY_SIZE-1]固定了数组大小,且函数内部循环逻辑错误,进一步加剧了越界问题。
输入提示低级错误
- 输入Y坐标时,提示文本写的是“Enter the X coordinate”,会误导用户输入,需要改成对应Y坐标的提示。
快速修复要点
- 统一数组大小:将数组声明为
char map[ARRAY_SIZE][ARRAY_SIZE],匹配你需要的ARRAY_SIZE x ARRAY_SIZE网格。 - 修正所有循环条件:把循环终止条件从
<= (ARRAY_SIZE-1)改成< ARRAY_SIZE,比如初始化循环写成:for (int Xcord = 0; Xcord < ARRAY_SIZE; Xcord++) { for (int Ycord = 0; Ycord < ARRAY_SIZE; Ycord++) { map[Xcord][Ycord] = '$'; } } - 修正打印函数:调整循环条件为
< size(size传入ARRAY_SIZE),同时确保参数数组大小与声明一致。 - 修正输入提示文本,区分X和Y坐标。
内容的提问来源于stack exchange,提问作者Aidan Ibrahim
相关产品推荐
相关产品推荐

