为什么我在此函数中出现分段错误:
#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;
感谢您的帮助
答案 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是否正确初始化。