Puntatori

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

Risposte
vict85
"menale":
Cari ragazzi ma nel momento in cui dichiaro un puntatore ma non lo inizializzo , questo mi punta al "nulla" ? :-D :-D


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.

Raptorista1
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 :D
[Molto probabile un segmentation fault].

vict85
"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 :D
[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.

apatriarca
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.

menale1
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 ?

apatriarca
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.

menale1
Chiarissimi ragazzi ! :-D :-D

menale1
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 ! :-D :-D

Raptorista1
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 :P

hamming_burst
"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 :P


è no.
p = p 

risulterà sempre un numero sporco.

invece per farlo puntare a ste stesso sarà:

p = &p
:D

apatriarca
Occhio ai tipi! Se p ha tipo int *, &p avrà tipo int ** e quindi nella espressione
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.

Raptorista1
@ham_burst: :P :P :P

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

menale1
Quindi quel "NULL" per cosa sta ? Sta ad indicare che il puntatore non punti a nulla ?? :-D :-D

Deckard1
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).

menale1
Ok ! Allora credo che dopo tutte queste discussioni sia questa la soluzione migliore per cui optare ! :-D :-D

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.