[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