C 代码中的分段错误(核心已转储)

Segmentation fault (core dumped) in C code

我不确定这个错误是什么意思“运行: line 1:3 Segmentation fault(core dumped) ./a.out” 因为这是我第一次遇到它.似乎错误发生在这里

dgemm(40, &A, &B, &C);

这是我的代码

void dgemm (int n, double *A, double *B, double *C) {
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            double cij = C[i + j * n];
            for (int k = 0; k < n; k++) {
                cij += A[i + k * n] * B[k + j * n];
            }
            C[i + j * n] = cij;
        }
    }
}

int main() { 
    double A = 4.1;
    double B = 5.2;
    double C = 7.4;
    
    dgemm(40, &A, &B, &C);
    return 0;
}

谁能告诉我是什么导致了这个错误,我该如何解决?

这个:

               cij += A[i+k*n] * B[k+j*n];
         C[i+j*n] = cij;

是越野车。因为您要为所有三个变量传递一个指向双精度 单个 实例的指针:ABC。但是您正在访问每个,就好像它们是您函数中的数组一样。 0 以外的任何索引在您分配适当大小的数组之前都是无效的。

A​​、B 和 C 不是数组,它们是标量。当您将它们作为数组访问时,您正在访问无效内存,这是未定义的行为。如果你想要数组,你可以这样做:

double A[1600];
double B[1600];
double C[1600];

如果您在编译时不知道 N 的大小,请在堆上分配数组:double *A = malloc(n * n * sizeof (double));

完成后务必free(A)