2015-04-20 5 views
5

L'obiettivo del mio programma è quello di leggere un file e generare la parola con le apparizioni massime, nonché il numero di aspetti. Ma sto avendo problemi con malloc e la sintassi di esso. Questa è la struttura che malloc si riferisce a:Come si usa malloc per allocare memoria per una struttura?

struct Word_setup { 
    char word[max_length]; 
    int count; 
}; 

Questa sezione del mio principale mi ha aiutato a scoprire che questo è stato il mio errore:

printf("Pre-Allocation Test"); 

    struct Word_setup *phrase; 

    phrase = (struct Word_setup *) malloc(SIZE); 

    if (phrase == NULL) 
     {printf("Failure allocating memory"); return 0;} 

Mi sembra di stampare, Pre-Allocation Test, e poi congela. Come ho detto prima, non sono chiaro come risolvere questo problema, ma l'ho isolato.

* Incase ti stai chiedendo cosa SIZE è:

#define SIZE (sizeof(phrase))


Edit:

Per curiosare versione del compilatore/OS/etc .: Windows 7 a 64 bit , GCC 4.9.2

Se desideri ulteriori informazioni su questo fammelo sapere.

+1

'SIZE # define (sizeof (* frase))' – BLUEPIXY

+0

[In C non si dovrebbe lanciare il risultato di 'malloc'] (http: // StackOverflow .com/questions/605845/do-i-cast-the-result-of-malloc/605858 # 605858) –

+3

Vale veramente la pena usare 'type * ptr = malloc (sizeof (* ptr));' così che tu possa ' t cadere in questo tipo di errore anche se si cambia 'type'. – edmz

risposta

5
phrase = (struct Word_setup *) malloc(SIZE); 

dovrebbe essere

phrase = malloc(sizeof(struct Word_setup)); 

quello che hai è

#define SIZE (sizeof(phrase)) 

vi darà dimensioni del puntatore non dimensione della struttura. È inoltre possibile utilizzare un metodo più generico di allocazione di memoria

type *p = malloc(sizeof(*p)); 
+2

Problema di stile minore: '()' non necessario. Potrei usare 'malloc (sizeof * p)' – chux

+0

Se faccio questo, quando costruisco il programma in sublime, mi dice che c'è stato un errore nel convertire il puntatore del vuoto nella struct – krazibiosvn

+0

"Puoi anche usare un metodo più generico di allocando memoria "non puoi fare praticamente nulla con un' void * 'e devi lanciarlo su qualcosa per dargli un significato, quindi tornare a [questo] (https://stackoverflow.com/questions/605845/do -i-Cast-il-risultato-di-malloc? RQ = 1). – edmz