2015-04-20 3 views

ответ

-1
char a[12]; 
char* b = &a[0]; 
int* c = (int*)b; 
c[0] = n1; 
c[1] = n2; 
short* d = (short*)(b + 8); 
d[0] = s1; 
d[1] = s2; 

Редактировать: когда эти статусы остаются в функции, тогда не будет проблемы с строгим псевдонимом.

Кроме того, если вы хотите узнать больше о ступенчатости найти эту функцию из источника GCC в: c_common_get_alias_set

+0

'int * c = (int *) b' нарушает строгую сглаживание, и нет гарантии, что' a' даже подходящим образом выровнен для доступа через указатель 'int *'. – a3f

+0

Как я уже сказал, я рассмотрел строгий псевдоним. Char * не нарушит строгого сглаживания. И я подтверждаю это из источника GCC. – linzuojian

+0

@linzuojian. Помимо GCC есть другие компиляторы. Вы также предполагаете, что 'int' - 32 бита, 'short' - 16 бит, а 'char' - 8 бит. Ни один из них не указан в стандарте. Только минимальные размеры. – Degustaf

2

Вот один (C99) способ, если вы хотите, родной порядок байтов машины:

union { 
    struct { 
    uint32_t a, b; 
    uint16_t c, d; 
    } ints; 
    char bytes[12]; 
} tmp; 

tmp.ints.a = 0xdeadf00d; 
tmp.ints.b = 0xfeedbabe; 
tmp.ints.c = 0xfee1; 
tmp.ints.d = 0x600d; 

Теперь вы может получить доступ к массиву tmp.bytes, чтобы получить байты, которые составляют числа. На ideone, bytes содержит:

0d f0 ad de be ba ed fe e1 fe 0d 60 

Вы можете добавить некоторые (компилятор специфического) инструкции отступы, чтобы убедиться, что целые числа являются «упакованными» тоже. Вышеприведенное имеет приличное выравнивание для многих компиляторов.

Смежные вопросы