PDA

Visualizza la versione completa : [C] malloc e segmentation fault


uMoR
08-01-2006, 19:21
allora ho il seguente codice:



char *hostQuery[MAX_THREAD*2];
...
hostQuery[i+1] = (char *)malloc(sizeof(char)*strlen(p3));
strcpy(hostQuery[i+1], p3);
...


Segfaulta sulla malloc(), quando i=2 e p3 una stringa di 134 caratteri, hostQuery[i+1] = "0x0".

Ho aggiunto un controllo per vedere se la malloc restituiva NULL ma segfaultava ugualmente, di memoria ne ho ancora
disponibile, per cui non capisco quale sia l'errore.

Avete idee ?

oregon
08-01-2006, 19:27
Quanto vale

MAX_TRHEAD

?

uMoR
08-01-2006, 19:51
50.. :)

oregon
08-01-2006, 20:11
Presumo tu lavori con Linux e gcc ...

Non ho capito bene quando scrivi

hostQuery[i+1] = "0x0"

se intendi che il puntatore restituito dalla malloc e' zero, anche perche' dici che l'errore lo hai sulla malloc stessa e quindi non e' possibile sapere quanto vale il puntatore.

Secondo me il problema lo hai sulla istruzione seguente, la strcpy, e questo perche' nell'allocazione della memoria non hai previsto lo spazio per il terminatore. Dovresti modificare la malloc in questo modo

hostQuery[i+1] = (char *)malloc(sizeof(char)*(strlen(p3)+1));

per non avere problemi con la strcpy che segue

uMoR
08-01-2006, 20:26
Quello l'output di gdb su quel puntatore (ho verificato che fosse vuoto).

Ma la strcpy alla fine della stringa aggiunge uno '\0' anche se c' gi nella stringa da copiare ?
facendo infatti print p3[numero ultimo carattere] c' \0, per cui non dovrei avere bisogno del +1 nel malloc..

oregon
08-01-2006, 20:47
Certo ... lo aggiunge ... ma lo spazio lo devi prevedere tu.

uMoR
08-01-2006, 20:51
Ok ho aggiunto li e non segfaulta pi li..

ora mi da un errore una free:

free(): invalid pointer

che sclero !! :D

ps il puntatore non nullo

oregon
08-01-2006, 21:32
Questo e' un altro problema.

Devi aprire un altro thread specificando il problema e il codice relativo (ovviamente non basta far vedere la free ...)

Loading