[so] Intrebare despre pointeri legata de tema2
Razvan Deaconescu
razvand at cs.pub.ro
Mon May 12 20:08:18 EEST 2008
On Mon, 2008-05-12 at 09:29 -0700, Full Name wrote:
> Fie exemplul:
>
> int * a;
> printf(" continutul long double de la adresa a: %ld ", (long double)
> *a);
>
> Acesta afiseaza un continut long double de la adresa a; la fel de bine
> puteam sa convertesc acel continut ca char.
Recomandare 1:
Adauga
*a = 42;
inainte de printf.
Recomandare 2:
Adauga
a = 0;
inainte de printf.
Ce se intampla?
Faptul ca afisarea nu iti da o eroare este o intamplare. Intamplarea
face ca a (pointer) sa puncteze catre o zona valida din spatiul de
adresa al procesului tau.
a este un pointer, deci o variabila, a carui valoare este o adresa. Daca
adresa este 0x12345678 atunci expresia *a inseamna "valoarea continuta
la adresa 0x12345678". Daca, dintr-o _intamplare_, acea adresa este
valida in contextul procesului tau, atunci nu va fi vorba de acces
invalid - page-fault - SIGSEGV. Dar, repet, dintr-o _intamplare_. Nu
este nimic determinist.
De-asta se recomanda cand lucrati cu pointeri sa ii initializati
(eventual la NULL) ca sa nu ii folositi cu o valoare _intamplator_
initializata la o valoare valida.
Intrebarea ta era deci: de ce **a da eroare, iar *a nu da eroare?
Nicidecum "de ce *a merge, iar **a nu merge?". _Intamplarea_ a facut ca
*a sa "mearga".
Razvan
P.S.: Trimite mesaje text, te rog. E o "durere" sa replic la mesaje
non-text.
P.P.S.: Sper ca am subliniat de suficient de multe ori cuvantul
_intamplare_ ca se inteleaga nedeterminismul rezultat din omiterea
initializarii, al diverselor argumente (vezi open cu O_CREAT),
neintelegerii complete a interfetelor etc.
--
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.
More information about the so
mailing list