Newsgroup: it.comp.lang.c
Titolo: sizeof(pointers): cosa dice lo standard

Ecco le risposte che volevate: ho postato un messaggio su
comp.lang.c.moderated, e mi hanno risposto sia per mail che sul
newsgroup.
- Intanto chiariamo che si parla di puntatore a tipo; i puntatori a
  funzione possono essere di dimensioni e struttura del tutto
  differente dai puntatori a tipo.
- E' garantito dallo standard che ogni puntatore a T possa essere
  convertito in un puntatore a void e poi riconvertito in un puntatore
  a T ottenendo, alla fine, lo stesso valore di partenza; questo
  implica che la dimensione (sizeof) dei puntatori a void sia non
  minore di quella di puntatore a T (qualunque sia T).
- E' garantito inoltre che ogni puntatore a struttura sia identico al
  puntatore al primo elemento della struttura; quindi la dimensione
  dei puntatori a struttura deve essere almeno uguale a quella dei
  puntatori al loro primo elemento.
- Ma le parti rilevanti dello Standard sono 6.1.2.5 per C89 (ANSI/ISO
  C), e 6.2.5.27 per il recentemente approvato C9X.  In esse si
  garantisce: che puntatori a void e a carattere devono avere la
  stessa rappresentazione (e quindi la stessa dimensione) e lo stesso
  allineamento; e che anche puntatori a oggetti con lo stesso tipo (o
  tipi compatibili) e differente qualifica (ad esempio signed,
  unsigned, const, volatile) devono avere la stessa rappresentazione
  ed allineamento.
Quindi, a priori, puntatori ad oggetti di tipi incompatibili, come
char e double, possono avere rappresentazione e lunghezza differenti.
E' da notare che "avere la stessa rappresentazione" e' piu' stringente
che "avere la stessa dimensione"; uno dei miei interlocutori (David
Thompson) afferma di aver lavorato in un ambiente (non dice quale) in
cui sizeof(char *) e sizeof(int *) erano le stesse (16 bits), ma la
rappresentazione interna differente: per cui usare un tipo di
puntatore al posto dell'altro causava catastrofi.
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it

   puntatori al loro primo elemento.
Infatti, contrariamente a quello che avevo detto in precedenza, un
simile programma non funziona:
#include <stdio.h>
struct S;
void pippo( struct S *p )
{
    printf( "%ld\n", sizeof( p ) );
}
int main()
{
    struct S s;
    pippo( &s );
    return 0;
}
in quanto il compilatore non č in grado di capire la dimensione del
puntatore senza conoscere come č fatta la struttura. Mi scuso per la
cavolata detta precedentemente.
Bene. Pare che possiamo metterci una pietra sopra: i puntatori, in
generale, possono avere dimensioni diverse.
EMG

 generale, possono avere dimensioni diverse.
WOW.
E io che mi stavo convincendo di aver detto una castroneria :-)
Però in effetti non sapevo che alcuni tipi devono avere puntatori con la
stessa rappresentazione, per cui in parte sbagliavo anche io.
Per fortuna che avevo fatto l'esempio con char e float ;-)))
Scusate l'OT, ma qualche volta è bello scoprire di non aver detto str...
Ne approfitto per scusarmi se non sono molto presente sul NG da qualche
tempo, ma, lavoro a parte, ho un po' di casini da sistemare di tipo
linuxiani...
--
Alessandro Monti