| 	
	
	
		
		|||||||
  | 
		
| 
 | 
![]()  | 
	
	
| 
		 | 
	Strumenti | 
| 		
			
			 | 
		#1 | 
| 
			
			
			
			 Senior Member 
			
		
			
				
			
			
			Iscritto dal: May 2008 
				
				
				
					Messaggi: 412
				 
				
				
				
				 | 
	
	
	
	
		
			
			 
				
				linguaggio c curiosita' su malloc()
			 
			
		Volevo chiedervi info su un dubbio ke ho nell'uso di malloc questo ke vi riporto è un esempio:  
		
	
		
		
		
		
		
	
	void main () { short num=4; char *testo; testo=(char *)malloc(num); printf("%d\n",strlen(testo)); } l'output del programma è 14 ed è questo il mio dubbio ma io volevo creare una stringa ke contenesse 4 caratteri e me ne ritrovo una ke ne contiene 14? oppure il risultato significa qualcos'altro?  | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#2 | 
| 
			
			
			
			 Senior Member 
			
		
			
			
			Iscritto dal: Nov 2005 
				
				
				
					Messaggi: 2780
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 
		La risposta è un po' nella malloc, un po' nella strlen. La malloc alloca la memoria richiesta senza inizializzarla, quindi dentro può esserci qualunque cosa, invece la strlen restituisce il numero di caratteri tra l'inizio della stringa (che gli passi come parametro) e il primo carattere null ('\0') trovato. 
		
	
		
		
		
		
		
	
	PS: quando usi malloc ricordati di fare una free dopo  | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#3 | 
| 
			
			
			
			 Senior Member 
			
		
			
				
			
			
			Iscritto dal: May 2008 
				
				
				
					Messaggi: 412
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 
		ho apportato la modifica ke mi hai consigliato  
		
	
		
		
		
		
		
	
	void main () { short num=4; char *testo; testo=(char *)malloc(num); free(testo); printf("%d\n",strlen(testo)); } adesso l'output mi segna 9 potrei inserire quindi 7 caretteri ma nn è quello ke io voglio giusto?  | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#4 | 
| 
			
			
			
			 Senior Member 
			
		
			
				
			
			
			Iscritto dal: Sep 2005 
				Città: Opinions are like assholes: anybody has one... 
				
				
					Messaggi: 34290
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 
		altrimenti c'e' la calloc() (prototipo analogo) che inizializza tutto a zero-NULL 
		
	
		
		
		
		
			usatele meno che potete, l'abuso distrugge i programmi specie se si utilizzano compilatori malsani 
				__________________ 
		
		
		
		
	
	Ну давай !! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cina, bugiardo - stolen conto: non paghi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NON CERCO PIU' UN ALIMENTATORE DECENTE ----------------> LINK  | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#5 | 
| 
			
			
			
			 Senior Member 
			
		
			
				
			
			
			Iscritto dal: May 2008 
				
				
				
					Messaggi: 412
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 
		la cosa ke non mi è kiare è ke se dopo la malloc la variabile può contenere qualsiasi cosa allora il carattere nullo dovrebbe essere entro i 4 byte quindi la strlen dovrebbe segnalarmi al massimo 4 oppure di meno ma non di più, non so se mi sono spiegato.
		 
		
	
		
		
		
		
		
	
	 | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#6 | |
| 
			
			
			
			 Senior Member 
			
		
			
			
			Iscritto dal: Nov 2005 
				
				
				
					Messaggi: 2780
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 Quote: 
	
 Nel tuo esempio: Allochi 4 byte, ma non li inizializzi cosa contengono? Chissà... Lanci la strlen. Questa parte dal primo byte e controlla se è null, siccome non lo è (è un caso, poteva benissimo esserlo) incrementa il contatore interno e passa al carattere successivo. La stessa cosa si verifica per il secondo, il terzo e il quarto carattere, quindi strlen prosegue oltre il limite di 4 caratteri e va avanti così finché non trova il carattere null. Quando lo trova ti restituisce il valore del contatore.  | 
|
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#7 | 
| 
			
			
			
			 Senior Member 
			
		
			
				
			
			
			Iscritto dal: Jun 2002 
				Città: Dublin 
				
				
					Messaggi: 5989
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 Codice: 
	#include <stdlib.h>
#include <string.h>
int main()
{
  char *stringa;
  stringa = (char *) malloc(5 * sizeof(char)); /* 4 caratteri + il terminatore '\0' */
  memset(stringa, 0, 5 * sizeof(char));
  strcpy(stringa, "ciao");
  printf("Ho ottenuto: \"%s\".\n", stringa);
  free(stringa);
  return 0;
}
				__________________ 
		
		
		
		
	
	C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!  | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#8 | 
| 
			
			
			
			 Senior Member 
			
		
			
				
			
			
			Iscritto dal: Sep 2005 
				Città: Opinions are like assholes: anybody has one... 
				
				
					Messaggi: 34290
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 
		è bene ricordarsi anche di fare il controllo sulla riuscita della malloc onde evitare casini e puntatori a caiser 
		
	
		
		
		
		
			malloc restituisce null in caso di errore, meglio aprirla (sempre in cast come sopra) incapsulata in un if con controllo sul == NULL 
				__________________ 
		
		
		
		
	
	Ну давай !! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cina, bugiardo - stolen conto: non paghi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NON CERCO PIU' UN ALIMENTATORE DECENTE ----------------> LINK  | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#9 | 
| 
			
			
			
			 Senior Member 
			
		
			
				
			
			
			Iscritto dal: May 2008 
				
				
				
					Messaggi: 412
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 
		Grazie wingman adesso le cose mi sono più chiare non avevo pensato a memset per inizializzare le variabili  
		
	
		
		
		
		
		
	
	  , peccato che malloc non inizializzi le variabili ma forse per questo hanno pensato a memset.
		 | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#10 | 
| 
			
			
			
			 Senior Member 
			
		
			
				
			
			
			Iscritto dal: May 2008 
				
				
				
					Messaggi: 412
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 
		Stev hai ragione è meglio fare sempre dei controlli con queste funzioni onde evitare casini.
		 
		
	
		
		
		
		
		
	
	 | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#11 | |
| 
			
			
			
			 Senior Member 
			
		
			
				
			
			
			Iscritto dal: Sep 2005 
				Città: Opinions are like assholes: anybody has one... 
				
				
					Messaggi: 34290
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 Quote: 
	
 alloca a NULL n-byte 
				__________________ 
		
		
		
		
	
	Ну давай !! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cina, bugiardo - stolen conto: non paghi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NON CERCO PIU' UN ALIMENTATORE DECENTE ----------------> LINK  | 
|
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#12 | 
| 
			
			
			
			 Member 
			
		
			
				
			
			
			Iscritto dal: Apr 2007 
				
				
				
					Messaggi: 263
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 
		
Comunque se vuoi uno spazio di memoria che possa contenere stringhe fino a 4 caratteri, dovrebbe essere di 5 byte (4 byte per i caratteri e il "null terminator")
		 
		
	
		
		
		
		
		
	
	 | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#13 | 
| 
			
			
			
			 Senior Member 
			
		
			
			
			Iscritto dal: May 2004 
				Città: Napoli 
				
				
					Messaggi: 773
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 
		
Sì ma in pratica non c'entra niente con la richiesta dell'utente, che è solo un problema di strlen: usando calloc addirittura strlen restituirebbe 0. 
		
	
		
		
		
		
			Il problema è nel come è posta la domanda: tu non hai creato una "stringa di 4 caratteri", ma hai allocato 4 byte e hai dunque fatto puntare un char* a quell'area di memoria. Se ci copi, con strcpy, una stringa di 2 caratteri, strlen ti restituirà 2, se ce ne copi una di 10 strlen restituirà 10, ma questo non ti salverà dal casino di essere andato "oltre" lo spazio che avevi riservato, magari sovrascrivendo altre variabili. Nel tuo caso, per un puro caso 15 byte oltre il puntatore c'è una locazione di memoria che contiene uno 0, dunque il risultato di strlen è 14. Ciò non toglie che usare strlen su un char* che punta a memoria "vergine" e non a una stringa opportunamente terminata restituisce un valore che non ha alcun senso 
				__________________ 
		
		
		
		
	
	If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization. --Gerald Weinberg  | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#14 | 
| 
			
			
			
			 Senior Member 
			
		
			
				
			
			
			Iscritto dal: Sep 2005 
				Città: Opinions are like assholes: anybody has one... 
				
				
					Messaggi: 34290
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 
		si' 
		
	
		
		
		
		
			pero' siccome mi pare lui sia qui per imparare non credo gli faccia schifo sapere che se gli serve esiste un prototipo di funzione che gli inizializza a zero tutta l'area di memoria allocata e che in ottica futura puo' metterlo al riparo da errori o effetti collaterali causati da funzioni insicure che non tengono conto del finestringa (sprintf, ecc...) 
				__________________ 
		
		
		
		
	
	Ну давай !! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cina, bugiardo - stolen conto: non paghi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NON CERCO PIU' UN ALIMENTATORE DECENTE ----------------> LINK  | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#15 | |
| 
			
			
			
			 Senior Member 
			
		
			
			
			Iscritto dal: May 2004 
				Città: Napoli 
				
				
					Messaggi: 773
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 Quote: 
	
 Purtroppo, proprio perchè è un principiante, è terribile che non possa ragionare secondo le operazioni che dovrebbero banalmente essere definite su questi tipi ma debba farlo in ottica di puntatori. Quello che intendevo dire è che anche inizializzando quell'area di memoria, non avrebbe comunque ottenuto i risultati che si aspettava dalla strlen 
				__________________ 
		
		
		
		
	
	If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization. --Gerald Weinberg  | 
|
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#16 | 
| 
			
			
			
			 Senior Member 
			
		
			
				
			
			
			Iscritto dal: Jun 2002 
				Città: Dublin 
				
				
					Messaggi: 5989
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 
		
Come non quotarti... Venendo da linguaggi di più "alto livello" del C è stato il primo grosso ostacolo da superare... E comunque avevo già un po' di "esperienza", non oso immaginare chi inizia a programmare pensando a certa roba... brrr.
		 
		
	
		
		
		
		
			
				__________________ 
		
		
		
		
	
	C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!  | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#17 | 
| 
			
			
			
			 Senior Member 
			
		
			
				
			
			
			Iscritto dal: Sep 2005 
				Città: Opinions are like assholes: anybody has one... 
				
				
					Messaggi: 34290
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 
		che roba ? 
		
	
		
		
		
		
			adesso ci sono sti dialetti... c#... porcherie varie.... 
				__________________ 
		
		
		
		
	
	Ну давай !! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cina, bugiardo - stolen conto: non paghi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NON CERCO PIU' UN ALIMENTATORE DECENTE ----------------> LINK  | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#18 | 
| 
			
			
			
			 Senior Member 
			
		
			
				
			
			
			Iscritto dal: Jun 2002 
				Città: Dublin 
				
				
					Messaggi: 5989
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 
		Ad allocare, gestire, e deallocare correttamente la memoria anche se devi fare cose banali come leggere una sola parola da un file (che non sai a priori quanto sarà lunga) o concatenare due stringhette. Con altri linguaggi basta "stampare Stringa1 + Stringa2".  
		
	
		
		
		
		
			
				__________________ 
		
		
		
		
	
	C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!  | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#19 | 
| 
			
			
			
			 Senior Member 
			
		
			
				
			
			
			Iscritto dal: Sep 2005 
				Città: Opinions are like assholes: anybody has one... 
				
				
					Messaggi: 34290
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 
		beh in effetti ove occorre usare le stringhe a mano bassa il cpp e il namespace viene d'aiuto perchè li malloc te lo scordi 
		
	
		
		
		
		
			pero' se devi lavorare di fino o su controlli automatici il c è preferibile 
				__________________ 
		
		
		
		
	
	Ну давай !! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cina, bugiardo - stolen conto: non paghi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NON CERCO PIU' UN ALIMENTATORE DECENTE ----------------> LINK  | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
		
		  
	   | 
| Strumenti | |
		
  | 
	
		
  | 
Tutti gli orari sono GMT +1. Ora sono le: 07:40.









		
		
		

 , peccato che malloc non inizializzi le variabili ma forse per questo hanno pensato a memset.
		
 
 







