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

矩阵单元格赋值触发Invalid Write错误,请求排查代码问题

问题排查:矩阵访问时的Invalid Write错误

嘿,我一眼就找到你代码里的问题啦!这个内存越界错误的根源是内层循环的条件写错了,具体来看:

错误原因分析

你在初始化矩阵的嵌套循环里,内层循环的判断条件写成了i < M,而不是j < M:

for (int i = 0; i < N; i++){
    for (int j = 0; i < M; j++){  // 这里的i < M是错误的!
        //mat[i][j] = i+j;
    }
}

这个错误会导致:

  • 当i=0时,只要M>0,i < M就一直成立,j会无限递增(直到超出当前行分配的M个int的内存范围),触发invalid write错误。
  • 当尝试访问第二行(i=1)时,只要M>1,同样的逻辑会让j继续越界,错误持续出现。

不管你用mat[i][j]、*(*(mat + i) + j)还是mat[i * N + j](哦对了,最后这种访问方式其实只适合连续分配的一维矩阵,你的矩阵是每行单独malloc的,所以这种方式本身也有问题,不过当前的核心错误还是循环条件),只要j超出了每行的元素个数M,都会触发内存越界。

修正后的代码

把内层循环的条件改成j < M就可以解决问题:

int** matrice(int N, int M){
    int **mat = (int **)malloc(N * sizeof(int*));
    for(int i = 0; i < N; i++)
        mat[i] = (int *)malloc(M * sizeof(int));
    for (int i = 0; i < N; i++){
        for (int j = 0; j < M; j++){  // 这里改成j < M
            mat[i][j] = i+j;
        }
    }
    return mat;
}

另外补充个小提醒:你的矩阵是“指针数组+每行单独分配”的结构,所以mat[i * N + j]这种一维下标访问是不正确的,因为每行的内存不一定连续。如果想用一维访问方式,应该把矩阵整体分配成连续的内存块,再用指针指向它。

内容的提问来源于stack exchange,提问作者Alexandre Maneta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:33:06