C语言使用指针实现矩阵加法仅首行计算正确问题求助
错误原因
二维数组在C语言内存中是按行连续存储的,你代码中计算元素指针偏移的逻辑错误:访问第i行第j列元素的偏移量应为i * 列数 + j,而你仅使用了i + j计算偏移,导致除了第一行(i=0时偏移刚好等于j)之外的所有元素访问地址全部错位,因此出现只有前几行部分元素结果正确、其余位置值异常的问题。
修复方案
只需修改矩阵加法部分的指针偏移计算逻辑即可,提供两种可行写法:
写法1:保留双层循环,修正偏移计算
将原加法逻辑:
//Add the matrices int *loc_1=&matrix_1[0][0]; int *loc_2=&matrix_2[0][0]; int *loc_3=&matrix_3[0][0]; for(i=0;i<row;i++) { for(j=0;j<column;j++) { *(loc_3+i+j) = *(loc_1+i+j) + *(loc_2+i+j); } }
修改为:
//Add the matrices int *loc_1=&matrix_1[0][0]; int *loc_2=&matrix_2[0][0]; int *loc_3=&matrix_3[0][0]; for(i=0;i<row;i++) { for(j=0;j<column;j++) { // 行号 * 每行元素总数 + 列号 = 对应元素相对于首地址的偏移量 *(loc_3 + i * column + j) = *(loc_1 + i * column + j) + *(loc_2 + i * column + j); } }
写法2:单循环遍历所有元素(更简洁)
因为整个矩阵的元素是连续存储的,总元素数为row * column,可以直接用单循环遍历所有位置:
//Add the matrices int *loc_1=&matrix_1[0][0]; int *loc_2=&matrix_2[0][0]; int *loc_3=&matrix_3[0][0]; int total_cnt = row * column; for(int k=0; k < total_cnt; k++) { *(loc_3 + k) = *(loc_1 + k) + *(loc_2 + k); }
malloc分配场景注意事项
如果你使用malloc动态分配内存做矩阵,需要保证分配的是连续内存空间:不要逐行调用malloc分配,要么直接分配一维数组模拟二维矩阵,要么先分配行指针数组,再一次性分配一整块连续内存给所有行指针赋值,否则不能用首地址偏移的方式访问所有元素。
内容的提问来源于stack exchange,提问作者Yaaro Obba
相关产品推荐
相关产品推荐

