Struct initialisering problem?

stemmer
3

Jeg bruker en struct som dette:

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

Jeg ønsker å initialisere struct, og bruke malloc () metoden returnere en dynamisk minne som dette

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

Da ville jeg bruke frag pekeren som dette:

frag->seq=01001;

Så problemet oppstår når jeg returnerer en rekke fragmenter. feilmeldingen sa at (ved hjelp Valgrind verktøy):

Uninitialised value was created by a heap allocation

som kan fortelle meg hvordan jeg kan takle det. Takk skal du ha!

Publisert på 15/07/2009 klokken 02:07
kilden bruker
På andre språk...                            


4 svar

stemmer
6

Jeg er ikke sikker på at du har et reelt problem her, men for riktig etikette, ville tildeling være:

Fragment *frag=malloc(10*sizeof(Fragment));
if (frag) memset(frag,0,10*sizeof(Fragment));
Svarte 15/07/2009 kl. 02:11
kilden bruker

stemmer
4

Problemet er at selv om du bruker malloc å allokere minne for en Fragment struktur, har du ikke initialisert noen av verdiene. Minne returnert av malloc er ikke garantert å være noen bestemt verdi, så du må eksplisitt initial struct medlemmer

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

Hvis du vil garantert initialisert minne bør du bruke calloc. Den har en ekstra kostnad på zero'ing ut minnet, men det kan ikke være av betydning for programmet.

Også bør du sjekke at malloc faktisk lykkes :)

Svarte 15/07/2009 kl. 02:12
kilden bruker

stemmer
2

Problemet er malloc ikke initial noen av minne det tildeler. Valgrind tar særlig hensyn til å holde styr på alle regioner i minnet som ikke er initialisert.

Du bør nok ta hensyn til feilen selv, den eneste grunnen Valgrind (Forutsatt at alt fungerer riktig) bør skrive at feilen er fordi du forsøkte å gjøre bruk av de initialisert data et sted, som sannsynligvis utilsiktet. Bruken av unitialized variabler er ikke koden du har i ditt spørsmål, men.

Svarte 15/07/2009 kl. 02:18
kilden bruker

stemmer
0

Koden ser plausibel, men i det følgende linje;

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

Er du sikker på at du trenger 10*?

Hvis du trenger å bevilge 10 Fragments, så bør du ta ansvar for å initialisere alle 10.

Svarte 15/07/2009 kl. 02:13
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more