【问题标题】:Segmantation fault when adding elements to a structure向结构添加元素时出现分段错误
【发布时间】:2010-01-20 23:26:42
【问题描述】:

为什么我在这个函数中会出现分段错误:

#include <stdio.h>
#include <stdlib.h>
#include "math.h"

vec_t mtrx_multiple (sparse_mat_t a, vec_t c) {

    vec_t result;
    int i;

    result.n = a.n;
    printf("result.n: %d\n", result.n);


    result.vec = malloc(a.n * sizeof *result.vec);
    for(i=0; i<a.n; i++) 
        result.vec[i] = c.vec[i] * a.a[a.ja[i]];


    return result;
}

结构是:

typedef struct {
    int n;
    int *vec;
} vec_t;

typedef struct {
    int *a;
    int *ia;
    int *ja;
    int n;
} sparse_mat_t;

感谢您的帮助

【问题讨论】:

  • 你在哪一行得到段错误?您的索引很可能超出范围。 a.a等有没有用处?
  • 结构中的一些有用的变量名将有助于提高这一点的可读性。
  • a 是由测试函数使用其他函数生成的。它运作良好。 a.aj.a 具有 a.n 元素。
  • 另外,您检查过您的malloc() 返回值吗?您可能会向其传递大量数字,并且/或者内存不足。
  • n 究竟应该代表什么?

标签: c malloc segmentation-fault


【解决方案1】:

我怀疑问题出在a.a[a.ja[i]],您应该尝试验证值a.ja[i],然后再使用它们来索引a.a

了解a 的初始化方式以及段错误发生在哪一行会很有用。

【讨论】:

    【解决方案2】:

    Malloc 可能失败并返回 null。 a.ja[i] 可能不在 0 和 n 之间。无论如何,ja 数组应该代表什么?

    我们的推测不会产生答案。在调试器下运行你的程序会。

    【讨论】:

      【解决方案3】:

      我怀疑这是问题所在:

      result.vec = malloc(a.n * sizeof *result.vec); for(i=0; i

      原因是你不是mallocing 每个result.vec[i]..

      你能确认一下吗?

      编辑: 感谢 Alok 和 Devel 告知我我的错误... sizeof *result.vec 返回什么?诚然,看起来sizeof 之间的优先级与* 之间的优先级混淆了...

      希望这会有所帮助, 最好的祝福, 汤姆。

      【讨论】:

      • a.n 是许多元素,所以,据我了解 malloc,这应该为所有 a.n 新创建的元素分配内存。由于for(i=0; i&lt;a.n; i++),不能有更多元素。
      • @Alok:哎呀!我的坏... :(感谢Devel。
      • 关于 sizeof *result.vec 的事情,我在我的代码中测试了该行 :) 它返回 4,或者在我的情况下,当 result.n 为 5 时,整个表达式返回 20。
      • 但有趣的是,他得到了一个指向 result.vec 的指针的大小,而他应该得到一个 int 的大小,即指向的东西。对他来说幸运的是,巧合的是,这两个尺寸是一样的。
      • @Justin, sizeof *result.vec 在这种情况下完全等同于 sizeof(int),因为 result.vec 的类型是 int *sizeof 运算符可以应用于对象或类型。事实上,我建议将其应用于malloc 调用的对象:stackoverflow.com/questions/2012473/…
      【解决方案4】:

      typedef struct {
        int n;
        int *vec;
      } vec_t;

      int main(int argc, char **argv) { vec_t 结果; 诠释我; 整数大小; 结果.n = 5; 大小 = 结果.n * sizeof *result.vec; 结果.vec = malloc(大小); for(i=0; i

      我必须同意 Autopulated,这个版本的代码运行得很好,我在这次重构中唯一遗漏的是 a 和 c 相关的东西。我会检查 a 和 c 是否被正确初始化。

      【讨论】:

        猜你喜欢
        • 2021-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多