【问题标题】:Segmentation fault (core dumped) in C code [closed]C代码中的分段错误(核心转储)[关闭]
【发布时间】:2021-11-13 04:49:28
【问题描述】:

我不确定这个错误是什么意思“运行:第 1:3 行分段错误(核心转储)./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;
}

谁能告诉我是什么导致了这个错误以及如何修复它?

【问题讨论】:

  • this 解谜了吗?
  • 1) “分段错误”是运行时错误,而不是“编译错误”(根据您的原始标签)。 2) 更重要的是......如果 dgemm() 将输入参数 A、B 和 C 视为“40 元素数组”......那么你会更好地为 40 个元素分配空间!传递“addressof”单个双精度而不是为 n 元素数组分配空间几乎肯定会导致分段错误!
  • 它实际上将它们视为 1600 个元素的数组。

标签: c segmentation-fault


【解决方案1】:

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

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

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

完成后一定要free(A)

【讨论】:

    【解决方案2】:

    这个:

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

    有问题。因为您将指针传递给所有三个变量的 single 实例:ABC。但是您正在访问每一个,就好像它们是您的函数中的一个数组一样。在分配适当大小的数组之前,除0 之外的任何索引都是无效的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 2020-04-12
      相关资源
      最近更新 更多