2010-04-21 8 views
7

Próbuję wyśledzić segfault za pomocą valgrind. Pojawia się następujący komunikat z valgrind:Valgrind mówi "alokacja stosów", mówię "alokacja sterty"

==3683== Conditional jump or move depends on uninitialised value(s) 
==3683== at 0x4C277C5: sparse_mat_mat_kron (sparse.c:165) 
==3683== by 0x4C2706E: rec_mating (rec.c:176) 
==3683== by 0x401C1C: age_dep_iterate (age_dep.c:287) 
==3683== by 0x4014CB: main (age_dep.c:92) 
==3683== Uninitialised value was created by a stack allocation 
==3683== at 0x401848: age_dep_init_params (age_dep.c:131) 
==3683== 
==3683== Conditional jump or move depends on uninitialised value(s) 
==3683== at 0x4C277C7: sparse_mat_mat_kron (sparse.c:165) 
==3683== by 0x4C2706E: rec_mating (rec.c:176) 
==3683== by 0x401C1C: age_dep_iterate (age_dep.c:287) 
==3683== by 0x4014CB: main (age_dep.c:92) 
==3683== Uninitialised value was created by a stack allocation 
==3683== at 0x401848: age_dep_init_params (age_dep.c:131) 

Jednak tutaj jest linia wykraczająca:

/* allocate mating table */ 
    age_dep_data->mtable = malloc (age_dep_data->geno * sizeof (double *)); 
    if (age_dep_data->mtable == NULL) 
    error (ENOMEM, ENOMEM, nullmsg, __LINE__); 
    for (int j = 0; j < age_dep_data->geno; j++) 
    {  
131=>  age_dep_data->mtable[j] = calloc (age_dep_data->geno, sizeof (double)); 
     if (age_dep_data->mtable[j] == NULL) 
error (ENOMEM, ENOMEM, nullmsg, __LINE__); 
    } 

Co daje? Myślałem, że wszelkie wezwanie do malloc lub calloc przydzielone miejsce sterty; nie ma tu żadnej innej zmiennej, prawda? Czy to możliwe, że nie ma kolejnej alokacji (nieprzyzwoitego przydziału na stos)?

EDYCJA: Moje bieżące podejrzenie to tablica przydzielona do stosu: Deklaruję wskaźnik do podwójnego (stosu), a następnie przypisuję mu wynik funkcji zwracającej double *. Następnie przypominam sobie to do wcześniej przydzielonego miejsca.

Nie mogę sobie przypomnieć, zapamiętywać ani przypisywać zmiennej stosu, a mam nadzieję, że się utrzyma, czy mogę?

+0

Czy możemy zobaczyć więcej kodu? Może age_dep.c – eyalm

Odpowiedz

-1

Mam ponieważ okazało się, że ten błąd valgrind

Conditional jump or move depends on uninitialised value(s) 

dzieje się cały czas i nie jest źródłem błędu. Wydaje się być czerwonym śledziem w większości przypadków, z którymi się zetknąłem od momentu opublikowania tego pytania.

+1

Joel, nie, to nigdy nie jest czerwony śledzia, i zawsze powinieneś to naprawić. Jest to potencjalnie bardzo poważny błąd (choć czasami nieszkodliwy). –

0

możliwa przyczyna:
zdefiniować age_dep_data->mtable jak double* ale powinno być double** być tablicą tablic

+0

Czy to właśnie robię? Przydzielam tablicę o rozmiarze n * (wielkość wskaźnika do podwójnego), a następnie dla każdego wskaźnika w tej tablicy przydzielam tablicę o rozmiarze m * (wielkość podwójnej). Czy muszę używać sizeof (double **) w wywołaniu malloc()? –

+1

nie, kod jest OK; nie możemy zobaczyć deklaracji age_dep_data-> mtable - powinno być zadeklarowane jako double ** –

+0

Jest zadeklarowane jako double ** w strukturze (również przydzielane dynamicznie). –