2009-07-15 3 views
3

J'utilise une struct comme ceci:Problème d'initialisation de structure?

define struct _Fragment{ 
    int a; 
    char *seq; 
}Fragment; 

Je veux initialiser le struct, et en utilisant la méthode malloc() retourne une mémoire dynamique comme celui-ci

Fragment *frag=malloc(10*sizeof(Fragment)); 

Ensuite, je l'aide de la pointeur de frag comme ceci:

frag->seq="01001"; 

Ensuite, le problème se produit lorsque je renvoie beaucoup de fragments. le message d'erreur dit que (en utilisant l'outil valgrind):

Uninitialised value was created by a heap allocation 

qui peut me dire comment je peux y faire face. Je vous remercie!

+1

Je pense que vous voulez dire "typedef struct ..." pas "define struct ..." – mhawke

Répondre

6

Je ne suis pas sûr que vous avez un vrai problème, mais pour l'étiquette appropriée, votre allocation serait:

Fragment *frag=malloc(10*sizeof(Fragment)); 
if (frag) memset(frag,0,10*sizeof(Fragment)); 
+12

il est plus facile d'utiliser calloc() – Juliano

4

Le problème est que même si vous utilisez malloc pour allouer de la mémoire pour une structure de Fragment, vous n'avez initialisé aucune des valeurs. La mémoire retournée par malloc n'est pas garanti d'être une valeur spécifique de sorte que vous devez initialiser explicitement les membres struct

Fragment* frag = malloc(10*sizeof(Fragment)); 
int i = 0; 
for (i = 0; i < 10; i++) { 
    frag[i].a = 0; 
    frag[i].seq = NULL; 
} 

Si vous voulez GARANTIS mémoire initialisé, vous devez utiliser calloc. Il a un coût supplémentaire de zéro sur la mémoire mais il peut ne pas être significatif pour votre application.

Aussi, vous devez vérifier que malloc réussit effectivement :)

0

Votre code semble plausible, mais dans la ligne suivante;

Fragment *frag=malloc(10*sizeof(Fragment)); 

Êtes-vous sûr de vouloir utiliser 10*?

Si vous avez besoin d'allouer 10 fragments, alors vous devez prendre la responsabilité de tous les 10. initialiser

+0

Non, le nombre de je veux obtenir est dynamique. –

+0

Bon alors, si vous avez besoin de 10, vous devez initialiser 10! Dans votre code, vous avez initialisé un seul champ du premier fragment. –

2

La question est malloc n'initialise pas de la mémoire qu'il alloue. Valgrind prend particulièrement soin de garder une trace de toutes les régions de la mémoire qui n'ont pas été initialisées. Vous devriez probablement tenir compte de l'erreur, la seule raison pour laquelle Valgrind (En supposant que tout fonctionne correctement) devrait imprimer cette erreur parce que vous avez tenté d'utiliser les données non initialisées quelque part, ce qui est probablement involontaire. Cependant, l'utilisation de variables unitalisées ne figure pas dans le code que vous avez dans votre question.