Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Ritornare un puntatore ad una stringa senza deallocarla
Forum - C/C++ - Ritornare un puntatore ad una stringa senza deallocarla - Pagina 3

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:50
Venerdì, 22/01/2016
Ok, ma non è una questione di ordine.

Molte volte il main (in generale, meglio parlare della "funzione chiamante") non conosce le necessità di memoria della "funzione chiamata" e quindi non può allocarla.

In questo caso, è la funzione chiamata che la alloca restituendo il puntatore e lasciando la responsabilità della liberazione alla chiamante (pena memory leak). E non hai alternative in questo caso.

Ad esempio, prendi la funzione (API) di Windows NetServerEnum

https://msdn.microsoft.com/it-it/library/windows/desktop/aa ...

Questa alloca il buffer internamente e restituisce il puntatore tramite il doppio puntatore passato come parametro.
Dopo avere usato il buffer in uscita, la memoria eventualmente allocata deve essere liberata tramite la funzione NetApiBufferFree.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 23:05
Venerdì, 22/01/2016
ok, io non dicevo in generale, ma visto che so quanta memoria serve, lo faccio nello stesso posto.

e' più una questione mia di ordine, poi ovviamente se utilizzo librerie esterne, o se il progetto richiede altro, mi adeguo.

visto che ho la possibilità di scegliere, in questo specifico caso , forse, farò come dicevo, fermo restando che se mi rendo conto che cambiare porta a miglioramenti cambio .

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 23:12
Venerdì, 22/01/2016
Capisco il problema di ordine derivato da allocazione e deallocazione di risorse in posizioni diverse del programma, ma se passi il puntatore alla memoria da riempire come hai intensive di controllare che sia memoria non deallocata e della dimensione giusta? Se metti il malloc nella tua funzione e ritorni il puntatore all'area di memoria riempita mantieni un certo ordine degli input e output e puoi controllare la validità della memoria solo controllando che non punti a NULL.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 10:12
Martedì, 26/01/2016
Testo quotato

Postato originariamente da Mikelius:

ok, io non dicevo in generale, ma visto che so quanta memoria serve, lo faccio nello stesso posto.

e' più una questione mia di ordine, poi ovviamente se utilizzo librerie esterne, o se il progetto richiede altro, mi adeguo.



Appunto, quello che voglio farti notare è che sono preminenti le esigenze del progetto, non quelle del tuo "ordine" ...


Solo per completezza, parli di EOF confondendolo con il NUL terminatore di stringa ... ovviamente non sono la stessa cosa ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 10:52
Martedì, 26/01/2016
Testo quotato

Postato originariamente da nessuno:

Solo per completezza, parli di EOF confondendolo con il NUL terminatore di stringa ... ovviamente non sono la stessa cosa ...



Questa purtroppo è una cosa che mi porto dalle superiori, il prof cercava di spiegarci il c++ a modo suo, e non ha minimamente differenziato le cosa al tempo, usava entrambi indistintamente. non e' che faccio confusione, ma devo reimparare ad utilizzarli correttamente nel loro giusto ambito.

Cmq NULL è usato nei puntatoti per indicare che il puntatore punta a nessuna cella di memoria (tipicamente il puntatore contiene il valore 0)

EOF è un valore speciale (tipicamente -1) che indica la fine della strasmissione dati (in caso di stringhe ad esempio, che la stringa è finita.

giusto?

Ultima modifica effettuata da il 26/01/2016 alle 10:55
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 13:29
Martedì, 26/01/2016
"EOF è un valore speciale (tipicamente -1) che indica la fine della strasmissione dati (in caso di stringhe ad esempio, che la stringa è finita."
No. EOF sta per End Of File ed è definito come -1. Non si usa per determinare la fine di una stringa o di uno stream, EOF di usa per per determinare la fine di un file, ovvero quando il cursore ha passato l'ultimo byte del file.

NULL è definito come :
#define (void*)0
quindi 0 e NULL NON SONO la stessa cosa. In realtà potrebbero esserlo per un calcolatore, ma logicamente, per un essere umano non lo sono.

NULL si usa per puntare a un'area di memoria inutilizzabile.

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 16:14
Martedì, 26/01/2016
Intanto grazie del tempo che stai dedicandomi,

allora:

EOF è diverso da '\0' che è il terminatore di stringa. '\0' è il NULL per le stringhe, corretto?
Non ero sicuro che fosse implementato a  -1 in tutti i compilatori, ma se dici che è universale ok, per questo ho scritto " tipicamente -1 ".
Pero', se le ritrovo li posto, ho trovato sorgenti che esaminavano una stringa e cercavano come ultimo valore proprio EOF (non '\0' o NULL, c'era proprio stringa == EOF ), in questo caso cosa indicherebbe?

So che concettualmente 0,NULL e "vuoto" sono cose completamente diverse, per un umano.
Per il puntatore a NULL, ho letto da parecchie parti che un puntatore a NULL è un puntatore che non punta a una zona di memoria usabile, e visto che ,visto che celle di memoria "vuote" è impossibile averle, sempre ci saranno valari spazzatura (ecco perchè è bene inizzializzare qualsiasi variabile) il valore NULL viene implementato come indirizzo di memoria 0x00 (ovviamente in questo caso devo pensare come una macchina, quindi se per essa sono la stessa cosa in questo caso, me lo faccio piacere)
in più mi pare di capire che c'è differenza tra un puntatore che punta a NULL e un puntatore che vale NULL.


Ultima modifica effettuata da il 26/01/2016 alle 16:16
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 17:33
Martedì, 26/01/2016
In realtà state facendo confusione tra NULL e NUL

il carattere terminatore è il NUL e corrisponde a quello con valore 0 del codice ASCII.

Altra cosa è la costante NULL.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo