risultato inaspettato quando vengono aggiunti alla puntatore
-
19-09-2019 - |
Domanda
Qualcuno mi ha detto questo po 'di stampe di codice 29. Perché?
int *a = 17;
printf("%d", a+3);
Soluzione
Perché quando si aggiunge a un puntatore si aggiunge la dimensione dell'oggetto. In questo caso la dimensione dell'oggetto è 4 (sizeof (int) == 4) -. Modo 17 + 3 * 4 == 29
Altri suggerimenti
Tutti sanno la risposta è 23, almeno sul 6809.
a+3 == a + (3 * sizeof(int)) == a + 6 == 17 + 6 == 23
a+3 == a + (3 * sizeof(int)) == a + 12 == 17 + 12 == 29
In puntatori linguaggio C non possono essere inizializzati con valori interi, con la sola eccezione di un'espressione costante integrale che valuta a zero integrale. 17
non soddisfa tale requisito.
È codice non è valido. Lo fa non era nulla di "stampa". La domanda ha alcun senso. Qualsiasi tentativo di analizzare la questione dal punto di vista del l'aritmetica dei puntatori sono rifiuti ridicoli e solo inutile di tempo.
ISO / IEC 9899: 1999 (programmazione Lingue - C)
6.5.16.1 assegnazione semplice
Vincoli
una delle seguenti ricoprire: 93)
- l'operando sinistro è qualificato o tipo aritmetico non qualificata e il diritto ha tipo aritmetico;
- l'operando sinistro ha una versione qualificato o non qualificato di un tipo di struttura o unione compatibile con il tipo di destra;
- entrambi gli operandi sono puntatori a versioni qualificate o non qualificate di tipi compatibili, e il tipo a cui punta sinistra ha tutti i qualificatori del tipo puntato dal destra;
- un operando è un puntatore a un oggetto o tipo incompleto e l'altro è un puntatore a una versione qualificato o non qualificato del vuoto, e il tipo a cui punta sinistra ha tutte le qualificazioni del tipo puntata da destra;
- l'operando sinistro è un puntatore e il diritto è una costante puntatore nullo; o
-. L'operando a sinistra è di tipo _Bool e il diritto è un puntatore
93) L'aspetto asimmetrico di questi vincoli rispetto al tipo qualificatori è dovuto alla conversione (Specificato in 6.3.2.1) che cambia lvalue a ‘‘il valore dell'espressione’’ che elimina ogni tipo qualificazioni dalla categoria tipo dell'espressione.
può stampare qualsiasi cosa .. si sta impostando un puntatore alla posizione '17' nella memoria ...