Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Nothing Phone (4a) Pro cambia pelle: l'alluminio unibody sostituisce la trasparenza integrale, portando una solidità inedita. Sotto il cofano troviamo uno Snapdragon 7 Gen 4 che spinge forte, mentre il display è quasi da top dig amma. Con un teleobiettivo 3.5x e la Glyph Matrix evoluta, è la prova di maturità di Carl Pei. C'è qualche compromesso, ma a 499EUR la sostanza hardware e la sua unicità lo rendono un buon "flagship killer" in salsa 2026
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro
Con Midnight, Blizzard tenta il colpaccio: il player housing sbarca finalmente su Azeroth insieme a una Quel'Thalas ricostruita da zero. Tra il dramma della famiglia Ventolesto e il nuovo Prey System, ecco com'è la nuova espansione di World of Warcraft
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Nuova frontiera per i robot tagliaerba, con Ecovacs GOAT O1200 LiDAR Pro che riconosce l'ambiente in maniera perfetta, grazie a due sensori LiDAR, e dopo la falciatura può anche rifinire il bordo con il tagliabordi a filo integrato
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-07-2008, 15:47   #1
Prince_81
Senior Member
 
L'Avatar di Prince_81
 
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?
Prince_81 è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2008, 15:54   #2
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2788
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
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2008, 16:00   #3
Prince_81
Senior Member
 
L'Avatar di Prince_81
 
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?
Prince_81 è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2008, 16:23   #4
Stev-O
Senior Member
 
L'Avatar di Stev-O
 
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
Stev-O è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2008, 16:36   #5
Prince_81
Senior Member
 
L'Avatar di Prince_81
 
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.
Prince_81 è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2008, 19:08   #6
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2788
Quote:
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.
No, il carattere nullo è uno dei possibili caratteri che possono trovarsi nella stringa ma non è detto che ci sia se non ce l'hai messo esplicitamente. E lo stesso vale per l'area di memoria che si trova dopo quella che hai allocato, non si sa dove si trovi il primo carattere null.
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.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2008, 20:04   #7
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
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!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2008, 20:42   #8
Stev-O
Senior Member
 
L'Avatar di Stev-O
 
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
Stev-O è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2008, 12:37   #9
Prince_81
Senior Member
 
L'Avatar di Prince_81
 
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.
Prince_81 è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2008, 12:39   #10
Prince_81
Senior Member
 
L'Avatar di Prince_81
 
Iscritto dal: May 2008
Messaggi: 412
Stev hai ragione è meglio fare sempre dei controlli con queste funzioni onde evitare casini.
Prince_81 è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2008, 14:36   #11
Stev-O
Senior Member
 
L'Avatar di Stev-O
 
Iscritto dal: Sep 2005
Città: Opinions are like assholes: anybody has one...
Messaggi: 34290
Quote:
Originariamente inviato da Prince_81 Guarda i messaggi
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.
c'e' la calloc

alloca a NULL n-byte
__________________
Ну давай !! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Cina, bugiardo - stolen conto: non paghi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
NON CERCO PIU' UN ALIMENTATORE DECENTE ----------------> LINK
Stev-O è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2008, 10:56   #12
stdecden
Member
 
L'Avatar di stdecden
 
Iscritto dal: Apr 2007
Messaggi: 263
Quote:
Originariamente inviato da Prince_81 Guarda i messaggi
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.
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")
stdecden è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2008, 16:18   #13
Albi89
Senior Member
 
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
Quote:
Originariamente inviato da Stev-O Guarda i messaggi
c'e' la calloc

alloca a NULL n-byte
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
Albi89 è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2008, 22:01   #14
Stev-O
Senior Member
 
L'Avatar di Stev-O
 
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
Stev-O è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2008, 23:18   #15
Albi89
Senior Member
 
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
Quote:
Originariamente inviato da Stev-O Guarda i messaggi
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...)
Certo, era per non confondergli le idee.
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
Albi89 è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2008, 23:30   #16
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da Albi89 Guarda i messaggi
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.
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!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2008, 23:36   #17
Stev-O
Senior Member
 
L'Avatar di Stev-O
 
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
Stev-O è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2008, 00:19   #18
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
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!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2008, 00:22   #19
Stev-O
Senior Member
 
L'Avatar di Stev-O
 
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
Stev-O è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico Recensione Nothing Phone (4a) Pro: finalmente in...
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro WoW: Midnight, Blizzard mette il primo, storico ...
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere? Recensione Samsung Galaxy S26+: sfida l'Ultra, m...
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti Zeekr X e 7X provate: prezzi, autonomia fino a 6...
L'Intelligenza Artificiale ora può...
Il data center del futuro secondo Huawei...
Spesa a domicilio senza conducente: robo...
Satoshi Nakamoto ha finalmente un volto?...
La Corea del Sud taglia fuori i bus elet...
GoPro taglia ancora: licenziato il 23% d...
Muse S Athena: la fascia che ti legge ne...
PS5 Pro e PSSR 2.0: tutti i giochi compa...
Dimensity 9600 Pro promette prestazioni ...
BMW i7 2026 adotta celle cilindriche Gen...
Cyberpunk 2077 si aggiorna su PS5 Pro co...
Valve porta Steam Link su Vision Pro per...
Google Maps: ufficiali 3 novità c...
TikTok punta tutto sull'Europa: un milia...
OnePlus Nord 6 ufficiale: arriva con una...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 19:07.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v