2010-01-20 2 views
0

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

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

Спасибо за помощь

+1

В какой строке вы получаете segfault? Скорее всего, ваше индексирование выходит за рамки. У 'a.a' и т. Д. Есть полезные значения? –

+2

Некоторые полезные имена переменных в структуре помогут читаемости LOT. – Joe

+0

Функция 'a' была сгенерирована тестовой функцией, используя другую функцию. Это работает хорошо. 'a.a' и' j.a' имеют элементы 'a.n'. – Devel

ответ

2

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

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

+0

проблема заключалась в том, что a не имеет элементов a.n ... – Devel

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

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

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

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

+0

'a.n' - это число элементов, поэтому, насколько я понимаю malloc, предполагается, что он будет хранить память для всех созданных элементов' a.n'. Не может быть больше элементов из 'for (i = 0; i Devel

+0

@Alok: Упс! Мой плохой ... :(Спасибо Devel. – t0mm13b

+0

Все в порядке, мы все делали глупые ошибки раньше! –

0

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

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

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 инициализируются должным образом.

Смежные вопросы