2013-02-16 26 views
7

Lo so: char * è un puntatore al carattere. e int * è un puntatore a int.La dimensione del carattere * è uguale alla dimensione di int *?

Quindi, voglio confermare seguenti due cose:

  1. Supponiamo ora sono su una macchina a 32 bit, quindi questo significa che gli indirizzi di memoria sono a 32 bit di larghezza. Ciò significa che la dimensione di char * e int * è sia di 32 bit (4 byte), giusto? Anche la dimensione del carattere * * è uguale alla dimensione di int *?

  2. supponiamo di avere: int * ptr;

Così ora sta facendo * ((ptr char * *)) = 0x154 è uguale a * ((int *) PTR) = 0x514 stesso, giusto? (0x514 è un qualsiasi indirizzo di memoria casuale)

Piattaforma: I am on x86.

P.S .: so che il casting di tipi non è un modo consigliato di codificare. Ma sto facendo la codifica del kernel, quindi DEVO fare casting di tipo!

+0

Anche se lo standard non lo dice, dubito che sarà facile trovare un ambiente in cui sia effettivamente diverso. – Mysticial

+0

Mentre le loro dimensioni sono le stesse nella pratica, i loro requisiti di allineamento non lo sono. – DCoder

+0

Se si sta eseguendo "codifica del kernel", questo limita già il numero di piattaforme su cui il codice può essere eseguito. Verifica con le specifiche del sistema operativo cosa è supportato. –

risposta

11

In C i puntatori sono not guaranteed to have the same size. Ora in realtà molti indicatori di implementazione avranno la stessa dimensione, ma questo è un dettaglio di implementazione del compilatore.

Dal C Faq:

La vecchia serie HP 3000 usa uno schema di indirizzamento differente per byte indirizzi rispetto per gli indirizzi di parola; come molte delle suddette macchine utilizza quindi rappresentazioni differenti per char * e void * puntatori che per altri puntatori

seconda del modello `` memoria '' in uso, processori 8086-famiglia (PC compatibili) può utilizzare i puntatori di dati a 16 bit e la funzione a 32 bit dei puntatori o viceversa.

Anche *((char *)ptr) = 0x154 non corrisponde a *((int *)ptr) = 0x154.Poiché si sta dereferenziando il puntatore, verranno scritti i dati delle dimensioni di un char e le dimensioni di un int nella posizione indicata da ptr. Supponendo un 8 bit char e un 32 bit int, scrivera '0x154 all'indirizzo di memoria assegnato a ptr e *((int *)ptr) = 0x154 scrivera' 0x0000000154 ai 4 byte iniziando dall'indirizzo assegnato a ptr.

+0

Risposta breve ma ottimo collegamento. Vorrei raccomandare di inserire la frase più interessante nella tua risposta, ad esempio "Le macchine Prime precedenti alla parola erano anche famose per richiedere puntatori di byte più grandi (char *) di puntatori di parole (int * 's)." –

+0

@ shf301 : L'ho modificato in * ((char **) ptr) = 0x154. – user1599964

+0

@ user1599964 Supponevo che fosse un errore di battitura così come avere valori diversi nell'esempio: il cast di un 'char **' o di un 'int *' significa cose molto diverse e non sono direttamente confrontabili. Sono diversi livelli di riferimento indiretto e non sono nemmeno vicini a fare la stessa cosa. – shf301

1

Tecnicamente parlando, lo standard C garantisce solo sizeof (char) == 1 e il resto è fino all'implementazione. Ma su architetture x86 moderne (ad esempio chip Intel/AMD) è abbastanza prevedibile.

Probabilmente avete sentito processori descritti come 16 bit, 32 bit, 64 bit, ecc. Questo di solito significa che il processore usa N-bit per interi. Poiché i puntatori memorizzano gli indirizzi di memoria e gli indirizzi di memoria sono interi, ciò indica in modo efficace quanti bit saranno utilizzati per i puntatori. sizeof viene in genere misurato in byte, quindi il codice compilato per processori a 32 bit riporterà la dimensione dei puntatori a 4 (32 bit/8 bit per byte) e il codice per i processori a 64 bit riporterà la dimensione dei puntatori a 8 (64 bit/8 bit per byte). È qui che arriva la limitazione di 4 GB di RAM per i processori a 32 bit: se ogni indirizzo di memoria corrisponde a un byte, per indirizzare più memoria sono necessari numeri interi maggiori di 32 bit.

In pratica, i puntatori saranno di dimensione 2 su un sistema a 16 bit (se ne trovi uno), 4 su un sistema a 32 bit e 8 su un sistema a 64 bit, ma non c'è nulla da guadagnare in basandosi su una data dimensione

+0

Questo va bene fino a quando non ci si imbatte in un'architettura a 36 o 48 bit che [anche il comitato standard ha preso in considerazione] (http://stackoverflow.com/questions/6971886/exotic-architectures-the-standard-committee-cares-about). –

Problemi correlati