【问题标题】:Why I am getting segmentation fault when I increase the value of elements of matrix in a matrix multiplication program in C? [closed]为什么当我在 C 中的矩阵乘法程序中增加矩阵元素的值时会出现分段错误? [关闭]
【发布时间】:2013-02-19 23:44:53
【问题描述】:

为什么当我增加矩阵元素的值(例如 11 20 10)时出现分段错误。通常我得到的结果矩阵的第一行全为 0,第二行矩阵正确。有时它也会给出正确的结果。我不知道这段代码有什么问题

【问题讨论】:

  • 确保您没有尝试访问未分配的内存,在空指针上调用函数可能是导致问题的原因。你的堆栈跟踪说什么,如果你调试你的代码,你应该能够看到哪一行失败了?

标签: c multithreading pthreads matrix-multiplication


【解决方案1】:

一个潜在的问题是成员变量K 似乎可以更改:

(data->B) = malloc((data->K)*sizeof(float*));
scanf("%d%d", &(data->K), &(data->N));
for ( i=0;i<(data->K);i++)
   ...

在设置数组A时首先初始化。然后它用于分配基本数组来保存B 的列。但是接下来的scanf 可能会导致一个不再与以前相同的值(可能导致内存覆盖)。

【讨论】:

  • 我更改了代码,现在我将 m,n 作为第一个矩阵的维度,将 p,q 作为第二个矩阵的维度,但如果现在我使用 2X2 矩阵它会给出答案,但使用 2 3 , 3 4 矩阵它要么给出分段错误,要么给出 2 行作为 0 和 1 行正确。我很困惑。我的跑步者功能正确吗?
  • 我的分段错误已解决,但我在矩阵的一行或多行中得到 0,我不知道为什么?
【解决方案2】:

看来你把这两行倒过来了,

(data->B) = malloc((data->K)*sizeof(float*));
scanf("%d%d", &(data->K), &(data->N));

所以,您使用的是之前的 data->K 值,因此如果您的第二个矩阵大于第一个矩阵,您将访问未分配的内存 -> scanf ("%f", &(data->B[i][j]))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    相关资源
    最近更新 更多