Ошибка сегментации при добавлении элементов в структуру - PullRequest
0 голосов
/ 21 января 2010

Почему я получаю ошибку сегментации в этой функции:

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

2 голосов
/ 21 января 2010

Я подозреваю, что проблема с a.a[a.ja[i]], вы должны попробовать проверить значения a.ja[i], прежде чем использовать их для индексации a.a.

Было бы полезно узнать, как инициализируется a, а также в какой строке происходит ошибка segfault.

0 голосов
/ 21 января 2010

typedef struct { int n; int *vec; } vec_t;</p> <p>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 инициализируются правильно.

0 голосов
/ 21 января 2010

Malloc может завершиться с ошибкой и вернуть ноль. a.ja [i] не может быть между 0 и n. В любом случае, что должен представлять массив ja?

Наше предположение не даст ответа. Запуск вашей программы под отладчиком будет.

0 голосов
/ 21 января 2010

Я подозреваю, что это линия, где проблема:

    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 IN для каждого result.vec[i] ..

Вы можете это подтвердить?

Изменить: Спасибо Alok и Devel за сообщение о моей ошибке ... Что возвращает sizeof *result.vec? По общему признанию это выглядит запутанным, как будто приоритет между sizeof смешивается с * ...

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

...