C语言二维数组初始化异常咨询:输入后打印结果不符合预期
问题根源:二维数组维度顺序搞反导致的越界访问
嘿,我一眼就瞅出问题所在了——你把二维数组的维度顺序和循环逻辑搞反啦,直接导致了数组越界的未定义行为,才会出现打印时元素乱掉的诡异情况!
来拆解一下问题:
你声明的数组是:
int array[width][height];
在C语言里,这个写法的意思是:创建一个包含width个元素的数组,每个元素又是一个拥有height个int的子数组。换句话说,这个数组的「行数」是width,「列数」是height。
但你的嵌套循环却是:
for (int i=0;i<height;i++){ // 循环height次,把height当成了行数 for (int j=0;j<width;j++){ // 循环width次,把width当成了列数 scanf("%d",&array[i][j]); } }
这里你把height作为第一维度(行)的循环上限,但你的数组第一维度只有width个位置。当i的值超过width-1时,就会越界访问数组之外的内存,破坏相邻的内存数据——这就是为什么你打印时会看到第一行后面的元素被第二行元素覆盖的原因,本质是内存越界引发的未定义行为。
两种快速修复方案:
方案1:调整数组声明,匹配循环逻辑
如果你本来就想要一个「height行、width列」的数组,直接把数组声明改成:
int array[height][width];
这样循环里的i遍历行(0到height-1),j遍历列(0到width-1),完全对应数组的维度,不会再越界。
方案2:调整循环范围,适配原数组声明
如果非要保留原数组的声明方式,那就修改循环的上限,让它匹配数组的实际维度:
for (int i=0;i<width;i++){ // i遍历数组的第一维度(共width个元素) for (int j=0;j<height;j++){ // j遍历每个子数组的元素(共height个int) scanf("%d",&array[i][j]); } }
额外小提醒:
你用的是C99引入的变长数组(VLA),虽然大部分主流编译器(GCC、Clang)都支持,但像MSVC这类编译器对VLA的支持有限。如果需要更好的跨平台兼容性,可以考虑用动态内存分配(malloc+free)来创建二维数组,不过这已经是超出当前问题的优化啦~
内容的提问来源于stack exchange,提问作者callum202
相关产品推荐
相关产品推荐

