2010-04-21 19 views
7

Değerli bir segfault izlemeye çalışıyorum. Ben valgrind gelen şu mesajı alıyorum: Ne verirValgrind "yığın ayırma" diyor "yığın ayırma" diyorum

/* 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__); 
    } 

:

Ancak
==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) 

, burada kusurlu bir hat? Malloc veya calloc ayrılmış yığın alanına herhangi bir çağrı düşündüm; Burada ayrılan başka bir değişken yok, değil mi? Göremediğim başka bir tahsisat var mı (sorunlu yığın tahsisi) mümkün mü?

DÜZENLEME: Şu andaki şüphem yığılmış olarak ayrılmış bir dizidir: Bir işaretçiyi çift (yığın) olarak bildirir ve sonra çift * döndüren bir işlevin sonucunu atar. Sonra onu daha önce tahsis edilmiş bir yere yapıştırıyorum.

Bir yığın değişkenini hatırlayamıyorum, memcpy veya atama değişkenini atamam, sonra da devam edeceğini umarım, yapabilir miyim?

+0

Daha fazla kod görebilir miyiz? Belki age_dep.c – eyalm

cevap

-1

. Bu soruyu yayınladığımdan beri karşılaştığım çoğu durumda kırmızı bir ringa gibi görünüyor.

+1

Joel, hayır, asla kırmızı bir ringa balığı ve her zaman tamir etmelisin. Potansiyel olarak son derece ciddi bir hatadır (bazen zararsız olsa da). –

0

olası nedeni:
Eğer double* olarak age_dep_data->mtable tanımlamak ama Sorunun ne olduğunu bilmiyorum

+0

Yaptığım şey bu mu? Bir dizi n * (ikiye işaretçinin boyutu) bir dizi tahsis ediyorum, o zaman bu dizinin her bir işaretçisi için bir m boyutu dizisi (bir çiftin boyutu) tahsis ediyorum. Malloc() çağrısı için sizeof (double **) kullanmam gerekir mi? –

+1

hayır, siz kod okeyiniz; age_dep_data-> mtable bildirimini göremiyoruz - çift olarak bildirilmelidir ** –

+0

Bir yapı içinde (** dinamik olarak ayrılmış) çift ** olarak bildirilir. –

2

diziler dizisi olmaya double** olmalı, ama

-track-origins=yes 

yardımcı olabilecek Şikayet ettikleri hakkında daha fazla bilgi almak; Detaylar için bu blog yazısı bkz: ben beri bu valgrind hata

Conditional jump or move depends on uninitialised value(s) 

her zaman olur ve hata kaynağı değildir bulduk http://blog.mozilla.com/nnethercote/2009/02/27/eliminating-undefined-values-with-valgrind-the-easy-way/

+0

'u geçiyorum Orijinleri kullanıyorum; Bundan bahsetmeyi unuttum. Beni yönlendirecek mi? –