2013-08-15 7 views
7

stavo lottando per fissare un codice di oggi, allora mi imbatto in qualcosa di simile a:allocare memoria per una struttura con un puntatore personaggio in C

typedef struct { 
int a; 
int b; 
int c; 
int d; 
char* word; 
} mystruct; 

int main(int argc, char **argv){ 

    mystruct* structptr = malloc(sizeof(mystruct)); 
    if (structptr==NULL) { 
     printf("ERROR!") 
     ... 
    } 
    ... 
    free(structptr); 

    return 0; 
} 

il codice è stato dando un sacco di errori di memoria a causa del fatto , che char* word è una stringa di lunghezza variabile e malloc non stava allocando abbastanza memoria per esso. In effetti, era solo l'assegnazione di 20 Bytes per l'intero struct. C'è un modo per aggirare questo problema, senza trasformare lo char* in sth come char word[50]?

+0

visto che hai avuto un commento, ma poi rimosso. Modifica la tua domanda con maggiori informazioni o invia una seconda domanda. Esistono metodi per far fronte a un vettore 'char' che cambia in lunghezza. – JackCColeman

+0

Ho aggiunto il commento e ho trovato la risposta nei commenti seguenti. Credo che una dimensione fissa del buffer sia in realtà la soluzione migliore poiché la parola rappresenterà un nome e i nomi non dovrebbero essere lunghi quanto un romanzo;). Grazie per l'aiuto.Ero solo curioso di allocare memoria per stringhe variabili, ecco perché l'ho chiesto. Ma stavo per passare ad array di lunghezza fissa comunque. –

+0

in questi giorni lo spazio (ad es. La RAM) è abbondante, quindi nella maggior parte dei casi la definizione di una matrice di caratteri di dimensioni pari a 1024 non causerà alcun problema. I buffer I/O sono di routine molto più grandi di questo. – JackCColeman

risposta

16

Si sta allocando solo memoria per la struttura stessa. Ciò include il puntatore a char, che è solo 4 byte sul sistema a 32 bit, perché fa parte della struttura. NON include memoria per una lunghezza sconosciuta di stringa, quindi se si desidera avere una stringa, è necessario allocare manualmente la memoria anche per quello. Se stai solo copiando una stringa, puoi utilizzare strdup() che assegna e copia la stringa. Devi comunque liberare la memoria da solo.

mystruct* structptr = malloc(sizeof(mystruct)); 
structptr->word = malloc(mystringlength+1); 

.... 

free(structptr->word); 
free(structptr); 

Se non si desidera allocare memoria per la stringa da soli, l'unica scelta è quella di dichiarare un array di lunghezza fissa nella vostra struct. Quindi sarà parte della struttura, e lo sarà sizeof(mystruct). Se questo è applicabile o no, dipende comunque dal tuo progetto.

+0

@ H2CO3, cura di elaborare ciò che pensi sia sbagliato? – Devolus

+1

@ H2CO3, non credo che Devolus apprezzi la tua prospettiva. – JackCColeman

+1

@JackCColeman, specialmente dal momento che non è molto costruttivo criticare senza alcuna informazione su ciò che sarebbe sbagliato. – Devolus

3

Aggiungere un secondo malloc per qualsiasi lunghezza (N) che serve per word

mystruct* structptr = malloc(sizeof(mystruct)); 

    structptr->word = malloc(sizeof(char) * N); 
-1

Usa word=malloc(128);

questo assegnerà 128 byte la tua parola varible,

1

Quando si allocare memoria per structptr, il puntatore word nello struct non ha memoria valida da indicare. Quindi puoi anche usare malloc un pezzo di memoria per word o fare il punto word con un altro carattere.

4

come si può leggere here è necessario allocare la char * separatamente:

mystruct* structptr = malloc(sizeof(mystruct)); 
structptr->word = malloc(sizeof(WhatSizeYouWant)); 
0

malloc struct esterno sarà solo allocare memoria 1 byte puntato da *word poiché è un tipo 'char *'. Se si desidera allocare più di 1 byte di memoria puntato da word, ci sono 2 opzioni:

  1. Come quello che hai detto, la dichiareremo come char word[50] invece di `char *'
  2. malloc/calloc (io personalmente preferisco calloc, facendoti risparmiare la fatica di zeromemory, che è molto importante ..) la struttura esterna, poi malloc/calloc l'interno word pure. Ricorda di chiamare lo free due volte in questo caso.