C语言二维数组拷贝到另一二维数组时输出不符合预期问题排查
问题根因
原代码存在两处核心错误:
- 数组越界访问:
numbers数组列数为8,合法列索引范围是07,原代码内层循环`j`的取值范围是015,当j>=8时访问numbers[i][j]属于越界操作。C语言二维数组按行连续存储,越界访问时会自动读取后续行的偏移数据,比如numbers[0][8]实际读取的是numbers[1][0]的值,这就是第二组输出为2、3、4的直接原因。 - 数据来源逻辑错误:原逻辑没有区分
output数组前后8行的数据源,期望需求中前8行对应numbers的0、1、2行,后8行对应numbers的3、4、5行,原逻辑未做偏移处理。
修正后代码
int main(){ int numbers[6][8] = { {1,1,1,1,1,1,1,1},//0 {2,2,2,2,2,2,2,2},//1 {3,3,3,3,3,3,3,3},//2 {4,4,4,4,4,4,4,4},//3 {5,5,5,5,5,5,5,5},//4 {6,6,6,6,6,6,6,6} //5 }; int output[2*8][3]; for(int j = 0; j < 2*8; j++){ int num_col = j % 8; // 前8行取numbers前3行,后8行取numbers后3行 int row_offset = j < 8 ? 0 : 3; for(int i = 0; i < 3; i++){ output[j][i] = numbers[i + row_offset][num_col]; } } for(int j = 0; j < 2*8; j++){ for(int i = 0; i < 3; i++){ printf("%d ", output[j][i]); } printf("\n"); } }
输出验证
运行修正后代码即可得到期望结果:前8行输出1 2 3 ,后8行输出4 5 6 。
内容的提问来源于stack exchange,提问作者Duno。
相关产品推荐
相关产品推荐

