那是矩阵分配错误?
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 instruction
;
munmap_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
我正在修改一个已经工作的项目,改变分配和访问方阵的方式。
之前,我是这样分配的:
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 instruction
;
munmap_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