Niemniej jednak, dane mogą być odzyskane z dowolnego adresu w pamięci, a w zależności od instrukcji mogą mieć one długość jednego bajta lub większą.

Przykłady Następujący kod źródłowy przedstawia „nierówny” dostęp do pamięci (napisany w języku C za pomocą składni AT&T).

#include <stdlib.h>

int main(int argc, char **argv) { int *iptr; char *cptr;

#if defined(__GNUC__) # if defined(__i386__) /* Aktywowanie walidacji wyrównania na x86 */ __asm__("pushf\norl $0x40000,(%esp)\npopf"); # elif defined(__x86_64__) /* Aktywowanie walidacji wyrównania na x86_64 */ __asm__("pushf\norl $0x40000,(%rsp)\npopf"); # endif #endif

/* malloc() zawsze przydziela "wyrównaną" pamięć */ cptr = malloc(sizeof(int) + 1);

/* Inkrementacja wskaźnika o jeden, przez co stanie się on niewyrównany */ iptr = (int *) ++cptr;

/* Usunięcie referencji jako wskaźnika typu 'int', które spowoduje niewyrównany dostęp */ *iptr = 42;

/* Poniższe operacje spowodują wywołanie błędu sigbus. short *sptr; int i;

sptr = (short *)&i; // Dla każdej inkrementacji nieparzystych wartości nastąpi "sigbus". sptr = (short *)(((char *)sptr) + 1); *sptr = 100;

*/

return 0; }