Puntatori
Cari ragazzi ma nel momento in cui dichiaro un puntatore ma non lo inizializzo , questo mi punta al "nulla" ?


Risposte
"menale":
Cari ragazzi ma nel momento in cui dichiaro un puntatore ma non lo inizializzo , questo mi punta al "nulla" ?![]()
Ti conviene considerarlo come un puntatore che punta ad un punto qualsiasi della memoria. Altrimenti ti conviene esplicitare che punta a NULL. In ogni inizializza sempre un puntatore prima di usarlo. È meglio.
No: se tu scrivi qualcosa come
potrebbe venire fuori un numero qualunque, che dipende dai bit che ci sono in quell'indirizzo di memoria. [Non sono per niente convinto di questa affermazione, e penso sia falsa XD]
Oppure crasha tutto
[Molto probabile un segmentation fault].
int * p;allora il computer prende l'indirizzo di p e si annota che in quel punto c'è scritto qualcosa che lui deve interpretare come se fosse un intero [i.e. deve leggere un certo numero di byte...]. Infatti se tu fai
int * p; printf("%d", *p);
potrebbe venire fuori un numero qualunque, che dipende dai bit che ci sono in quell'indirizzo di memoria. [Non sono per niente convinto di questa affermazione, e penso sia falsa XD]
Oppure crasha tutto

[Molto probabile un segmentation fault].
"Raptorista":
No: se tu scrivi qualcosa come
int * p;allora il computer prende l'indirizzo di p e si annota che in quel punto c'è scritto qualcosa che lui deve interpretare come se fosse un intero [i.e. deve leggere un certo numero di byte...]. Infatti se tu fai
int * p; printf("%d", *p);
potrebbe venire fuori un numero qualunque, che dipende dai bit che ci sono in quell'indirizzo di memoria. [Non sono per niente convinto di questa affermazione, e penso sia falsa XD]
Oppure crasha tutto
[Molto probabile un segmentation fault].
Di fatto possiede il valore che lo spazio di memoria che ora contiene il puntatore precedentemente possedeva. Può potenzialmente essere qualsiasi cosa. È imprevedibile.
Correggere un errore per un puntatore non inizializzato è una cosa molto complicata, perché l'applicazione tende a crashare in momenti imprevisti, o a non crashare affatto e avere comportamenti strani. Ancora peggio è la situazione di un puntatore che non è stato messo a 0 (o NULL) dopo che la memoria alla quale puntava è stata rilasciata. Il morale di tutto questo è che non si deve MAI lasciare non inizializzato un puntatore.
Chiarissimi . Complicando un pò la questione , se io volessi che il mio puntatore punti al nulla , dunque nemmeno dei residui di memoria , devo imporre p=0 ?
In C si usa normalmente NULL che è definito in stdlib.h, mentre in C++ credo sia più comune usare 0. Il nuovo standard del C++, che a quanto ne so non è ancora stato del tutto formalizzato e accettato come standard, ha introdotto la parola chiave nullptr per questo scopo. Qualsiasi sia la tua scelta, l'importante è essere consistente, tutti e tre i metodi (a patto che il terzo sia supportato dal tuo compilatore) causano un errore di segmentation fault a runtime quando vengono deferenziati.
Chiarissimi ragazzi !


In realtà la problematica è legata un programma in cui un dato puntatore non deve puntare a nulla se non in determinate condizioni , dettate dal programma stesso . Quindi il dubbio era proprio questo , cioè se fosse possibile avere un puntatore che non punti a nulla , per poi farlo puntare nel " momento opportuno " ! Credo che utilizzerò proprio Null , in modo che non punti a nulla . Difatti se non effettuo l'inizializzazione dello stesso , alla fine mi restituisce un valore ambiguo che , come da voi confermatomi , deriva da residui di memori pregressa . Grazie ancora !


Con tutte queste fantasticherie sui puntatori mi fai pensare cose strane come....
p punta a sé stesso XD XD
Scherzo, probabilmente il compilatore mi manda a quel paese
int * p; p = p;
p punta a sé stesso XD XD
Scherzo, probabilmente il compilatore mi manda a quel paese

"Raptorista":
Con tutte queste fantasticherie sui puntatori mi fai pensare cose strane come....
int * p; p = p;
p punta a sé stesso XD XD
Scherzo, probabilmente il compilatore mi manda a quel paese
è no.
p = p
risulterà sempre un numero sporco.
invece per farlo puntare a ste stesso sarà:
p = &p

Occhio ai tipi! Se p ha tipo int *, &p avrà tipo int ** e quindi nella espressione
verrà segnalato un errore di compilazione (a meno di usare un cast). È invece assolutamente possibile scrivere
ma il valore rimarrà semplicemente invariato. Forse l'unico modo perché quell'operazione sia possibile è di definire p come void *, per il quale potrebbe essere definito un cast implicito da ogni puntatore (ma molto probabilmente è definito solo nella direzione inversa). Per cui
potrebbe funzionare, ma molto probabilmente no. Con un cast è invece tutto possibile.
p = &p;
verrà segnalato un errore di compilazione (a meno di usare un cast). È invece assolutamente possibile scrivere
p = p;
ma il valore rimarrà semplicemente invariato. Forse l'unico modo perché quell'operazione sia possibile è di definire p come void *, per il quale potrebbe essere definito un cast implicito da ogni puntatore (ma molto probabilmente è definito solo nella direzione inversa). Per cui
void * p; p = &p;
potrebbe funzionare, ma molto probabilmente no. Con un cast è invece tutto possibile.
@ham_burst:

@tutti: scusate, perché stiamo facendo questo discorso?? XD XD



@tutti: scusate, perché stiamo facendo questo discorso?? XD XD
Quindi quel "NULL" per cosa sta ? Sta ad indicare che il puntatore non punti a nulla ??


NULL (in C) è una costante settata a 0. Si sceglie 0 perché non rappresenta un indirizzo di memoria accessibile (per lo meno nei moderni sistemi operativi).
Ok ! Allora credo che dopo tutte queste discussioni sia questa la soluzione migliore per cui optare !

