In alcune ipotesi , in C terza riga:
int* two = (int*)((char*)p + 7);
provoca già comportamento indefinito, perché il puntatore p non è allineato correttamente per il tipo si fa riferimento .
L'ipotesi è che i requisiti di allineamento per tipo int sono essere superiore per il tipo char. Questo è vero per la maggior parte delle architetture moderne. Dal momento che tutti gli allineamenti devono essere potenze di due e il valore 7 non lo è, l'aggiunta di quel valore al puntatore p non può produrre un puntatore con un allineamento tanto rigoroso quanto il requisito di allineamento per il tipo int.
(Citato da: ISO/IEC 9899: 201x 6.3.2.3 puntatori 7.)
Un puntatore a un tipo di oggetto può essere convertito in un puntatore a un tipo di oggetto diverso. Se il puntatore risultante non è allineato correttamente per il tipo di riferimento, il comportamento è indefinito.
(Citato da: ISO/IEC 9899: 201x 6.2.8 Allineamento di oggetti 4.)
Ogni valore di allineamento valido deve essere una potenza integrale non negativa di due.
È stato invocato * comportamento non definito * passando dati con tipo errato a 'printf()'. L'affermazione corretta da stampare sarà 'printf ("% p% p% zu% td \ n ", (void *) uno, (void *) two, sizeof (int), two-one);' – MikeCAT
I do not avere una citazione L'aritmetica del puntatore si basa sull'aritmetica intera e ciò è ben definito. Quindi penso che "due - uno" sia ben definito. anche se i puntatori non sono imballati come una persona ragionevole si aspetterebbe. D'altra parte - non farlo, nessuno lo vedrà nella tua base di codice. – Johannes
Anche solo tenere quel puntatore 'two' nel tuo programma non è valido in quanto il puntatore non soddisfa i vincoli di allineamento per' int' (anche se in pratica su gran parte dell'hardware non innescherà un errore fino a quando non proverai a dereferenziarlo su un processore che non corregge l'accesso alla memoria non allineato come ARM) – Thomas