向结构添加元素时出现分段错误

时间:2010-01-20 23:26:43

标签: c malloc segmentation-fault

为什么我在此函数中出现分段错误:

#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;

感谢您的帮助

4 个答案:

答案 0 :(得分:2)

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

了解a的初始化方式以及段错误的发生方式将非常有用。

答案 1 :(得分:0)

我怀疑这就是麻烦的地方:

    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]];

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

你能确认吗?

修改 感谢Alok和Devel通知我我的错误...... sizeof *result.vec返回什么?不可否认,sizeof之间的优先级与*混合......看起来很混乱......

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

int main(int argc, char **argv) { vec_t result; int i; int size; result.n = 5; size = result.n * sizeof *result.vec; result.vec = malloc(size); for(i=0; i<result.n; i++) { result.vec[i] = i; } return i; }

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