Newsgroup: it.comp.lang.c
Titolo: malloc -> alloc.h

char *buffer[8]; <--- questa variabile si mallocca? :P
Se si come??
Tnx Il Corvo

char *buffer[8]; <--- questa variabile si mallocca? :P
Innanzitutto alloc.h non e' un header standard, ma l'header giusto e'
stdlib.h.
Poi, sicuramente se buffer va rimpito in modo dinamico, va sicuramente
"mallocato" ciascuno degli otto puntatori a carattere.
Ma cosi' potrebbe non essere, ad esempio :
buffer[0] = "andrea" ;
Assegnazione di un puntatore a carattere (che in realta' e' un array
decaduto) a un altro puntatore a carattere.

No... quella non la puoi proprio "mallocare", in quanto lo fa gia il
compilatore e la tiene come costante. Potresti "mallocare" se avessi la
seguente situazione:
char *buffer;
int main()
{
/*...*/
buffer = (char *) malloc ( 10 * sizeof(char));
if(!buffer)
{
  fprintf(stderr, "Errore nell'allocazione della memoria");
  return -1;
}
sprintf(buffer, "123456789");
fprintf(stdout, "%s", buffer);
free(buffer);
return 0;
}
/* Piccola nota:
ho allocato 10 caratteri e poi ne ho messi 9 dentro la stringa, perche
quando usi una stringa devi sempre ricordarti di mettere il nul finale '\0'.
Usando la sprintf() ciň viene fatto in automatico, ma ovviamente richiede un
carattere in piů nella stringa allocata -> devi prevederlo e allocare un
byte in piů nella stringa! (altrimenti rischi di scrivere chissa dove nella
memoria del pc, combinando disastri incredibili!) */
Dome

Azzzzzzzzzzzzzzzzzzzzzzzzz!!! Ma vedi che disattento!!!
Mi ero perso la dichiarazione di buffer!!
Pensavo fosse "char buffer[8]", invece era "char *buffer[8]"!
Cavolo!! Cosi si che è allocabile!!
Pardon ;))
Dome

"Domenico Troiano" ha scritto nel messaggio

azzzz :-) ma io volevo sapere come :PPPP
ciao e tnx
Corvo

Uhm....penso cosi:
for(int i = 0; i<8; i++)
 buffer[i] = (char*) malloc (dimstringa);
for(i=0; i<8; i++)
 free(buffer[i]);
conta che dire
*buffer[], in qualche modo è molto simile a dire **buffer!
Dome

 Dome
Quindi se faccio
char **buffer;
buffer = (char**) malloc(8);
è giusto?

 ha scritto nel messaggio
news:QaKR6.4527$ZZ.1...@news.infostrada.it...

si..... con riserva...
Credo che tu voglia allocare in modo dinamico la
memoria che che allocheresti in modo automatico mediante
char *buffer[8];
In questo caso tu NON vuoi allocare char (sizeof(char)= 1) ma
dei puntatori a char (sizeof (char *) = tipicamente 4 ma a volte 2 o 8).
Quindi per scrivere bene quello che credo volessi scrivere...
char **buffer;
buffer = (char**) malloc(8 * sizeof(char *));
N.B. Sii ben conscio che con questa operazione tu hai solo allocato
lo spazio per otto puntatori a carattere. Non e' lecito a questo punto fare
ad esempio
strcpy(buffer[2], " voglio scriver qualcosa");
perche' non hai allocato la zona di memoria a cui punta buffer[2] devi
prima fare qualcosa tipo..:
buffer[2]=(char *) malloc (40);
Se tu volessi liberare bene la memoria dovresti prima fare i
free per le memorie puntate poi il free dell'array di puntatori ... quindi..
free(buffer[2]);
e poi
free(buffer);
E' importante che l'operazione di free sia fatta in modo inverso rispetto
alle malloc.... puoi ben capire che ci sarebbero grossi problemi
altrimenti....
                                        Andrea Zaghi

buffer = (char**) malloc(8);
*buffer[] e' molto diverso da **buffer.
char **buffer ;
int i ;
...
buffer = malloc( 8 * sizeof( char * ) ) ; 
for ( i = 0 ; i < 8 ; i++ )
    buffer[i] = malloc( 50 ) ;

buffer = (char**) malloc(8 * sizeof(char *));
Per scrivere bene :
char **buffer ;


azz non era poi cosě facile come sembrava :PPP
cmq vale la pena soffermarsi su queste cose visto che il puntatore č la
forza del C.
newsgroup superbo!
Corvo