那是矩阵分配错误?

That's matrix allocation is wrong?

我正在修改一个已经工作的项目,改变分配和访问方阵的方式。

之前,我是这样分配的:

double **M = calloc(n, sizeof(double *));
for (int i = 0; i < n; i++){
    M[i] = calloc(n, sizeof(double));
}

现在我尝试进行此分配以确保内存中的行保持在一起并减少 calloc 的数量:

double **M = calloc(n, sizeof(double *));
M[0] = calloc(n * n, sizeof(double));
for (int i = 1; i < n; i++){
    M[i] = &(M[0][i * n]);
}

我的免费电话是:

free(M[0]);
free(M); 

像这样执行分配并保持对数组的访问有任何问题M[i][j]

自从我做了这个修改后,我的程序抛出了之前没有抛出的错误和异常:15665 illegal hardware instructionmunmap_chunk(): invalid pointer [1] 12815 abort (core dumped).

当我更改 gcc 标志以尝试 运行 与 GDB 时,它工作正常。

我知道我可以分配一个“行矩阵”并通过 M_row[i*n +j] 访问,但我想继续使用 M[i][j]

是的,我发现这个实现没有任何问题。

经过一些测试,我发现问题出在编译选项上。 我按照教授的建议在 gcc 上使用 -mavx2。在项目开始时,没有提出任何问题,但是在 illegal hardware instruction 出现的一些修改之后。

发生这种情况是因为我的计算机不符合编译标志需要的要求。

为了解决这个问题,我只是将 -mavx2 更改为 -mavx