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ę?
Czy możemy zobaczyć więcej kodu? Może age_dep.c – eyalm