PDA

Visualizza la versione completa : [C] Problemi malloc()


danieletdg
26-03-2009, 16:56
Salve gente .. dovrei creare un vettore di stringhe .. le stringhe vengono inserite da tastiera .. credo di dover usare malloc() ma ho qualche problema.



#include <stdio.h>
#include <stdlib.h>

int main()
{
char *s[5];
int i;
int j;

for(i=0; i<5; i++)
{
s[i]= malloc(5*sizeof(char *));
printf("inserisci una stringa: ");
scanf("%s" , &s[i]);

}

for(j=0; j<5; j++){

printf("%s, " , (s+j));
}


return 0;
}


questo l'output da terminale .. quando stampo le stringhe che inserisco .. alcune non sono uguali .. qual secondo voi il problema .. vi ringraizo Daniele

macbook************$ ./puntatori
inserisci una stringa: d
inserisci una stringa: da
inserisci una stringa: dan
inserisci una stringa: dani
inserisci una stringa: danie
d, da, dan, danidanif, danif,

LeleFT
26-03-2009, 17:00
Regolamento...

punto 2: Indicare il linguaggio di programmazione nel titolo

punto 6:


Formattazione del codice sorgente.
Quando incollate una porzione di codice all'interno di un messaggio, utilizzate l'apposito tag



codice


che pu essere inserito automaticamente premendo il pulsante CODE: questo render il codice leggibile e facilmente comprensibile a tutti, agevolando gli utenti che desiderano aiutarvi.


Ho corretto io.


Ciao. :ciauz:

Stoicenko
26-03-2009, 18:17
nella malloc nel sizeof toglierei il char* e metterei char

la scanf vuole un puntatore e s[i] gi un puntatore no? non credo serva l'&

Stoicenko
26-03-2009, 18:26
allora, il char al posto del char* giusto l'& va bene invece..

danieletdg
26-03-2009, 20:14
ragazzi .. il problema sempre lo stesso .. anche se sostituisco char al posto di char * . L'output sempre lo stesso .. non capisco perch .. forse non allochiamo abbastanza memoria? L'& all'interno della scanf fondamentale .. altrimenti non risolve il riferimento. E' molto strano, eppure non arrivo manco a 20 righe di codice :( vi ringrazio ancora .. daniele

YuYevon
26-03-2009, 20:27
I suggerimenti di Stoicenko sono corretti... com' che non funziona? Al massimo mettici un cast "char *" nella chiamata alla malloc()...



#include <stdio.h>
#include <stdlib.h>

int main()
{
char *s[5];
int i, j;

for(i=0; i<5; i++) {

s[i]= (char *) malloc( 5 * sizeof(char) );
printf("inserisci una stringa: ");
scanf("%s" , s[i]);

}

for(j=0; j<5; j++){

printf("%s, " , (s+j));
}


return 0;
}


Ovviamente tieni presente che se allochi spazio per 5 caratteri, non potrai immettere stringhe che ne abbiano pi di 4 (il 5 riservato al terminatore).

EDIT: anzi no, c' un errore.



printf("%s, " , (s+j));


sostituisci con




printf("%s, " , *(s+j));


o con




printf("%s, " , s[j]);

danieletdg
26-03-2009, 20:51
ragazzi non mi va ..
printf("%s, " , s[j]); o
printf("%s, " , *(s+j)); mi da un errore di "segmentation fault". Il cast non credo sia il vero problema .. provate a farlo girare voi .. io uso un machintosh e gcc per compilare ... Sono convinto che l'errore nel ciclo for .. la condizione di uscita dal ciclo. Perche' ho notato che il ciclo termina quando inserisco una parola di 5 lettere .. se inserisco sempre parole di 4 lettere .. il ciclo infinito! Se invece inserisco solo dei singoli caratteri .. anzi fino a 3 .. l'output giusto! oddio ..
grazie ancora per l'aiuto.

YuYevon
26-03-2009, 21:04
Io ho compilato esattamente questo codice:



#include <stdio.h>
#include <stdlib.h>

int main()
{
char *s[5];
int i, j;

for(i=0; i<5; i++) {

s[i]= (char *) malloc( 5 * sizeof(char) );
printf("inserisci una stringa: ");
scanf("%s" , s[i]);

}

for(j=0; j<5; j++){

printf("%s, " , s[j]);
}


return 0;
}


con gcc 4.2.3 su Slackware e con questa esecuzione:



bash-3.1$ ./prova
inserisci una stringa: cane
inserisci una stringa: casa
inserisci una stringa: cosa
inserisci una stringa: tre
inserisci una stringa: due
cane, casa, cosa, tre, due,


non ho alcun problema.

Ti ricordo di non immettere stringhe pi lunghe di 4 caratteri... a meno che non allochi pi spazio.

danieletdg
26-03-2009, 21:07
Risolto .. grazie ragazzi .. il problema era il 5 nella malloc() .. allocavo spazio per stringhe inferiori ai 5 caratteri, l'avevo confuso con i 5 puntatori delle 5 stringhe. Grazie ancora .. gentilissimi!

Loading