You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:09:02