Нарушает ли оно строгие правила псевдонимов, чтобы перемещать элементы любого типа с помощью uint32_t, а затем читать их обратно? Если это так, то нарушает ли он также строгие правила наложения имен для memcpy из массива uint32_ts в массив любого типа, а затем считывает элементы обратно?
Следующий пример кода демонстрирует оба случая:
#include <assert.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
int main(void) {
const char *strings[5] = {
"zero", "one", "two", "three", "four"
};
uint32_t buffer[5];
int i;
assert(sizeof(const char*) == sizeof(uint32_t));
memcpy(buffer, strings, sizeof(buffer));
//twiddle with the buffer a bit
buffer[0] = buffer[3];
buffer[2] = buffer[4];
buffer[3] = buffer[1];
//Does this violate strict aliasing?
const char **buffer_cc = (const char**)buffer;
printf("Test 1:\n");
for (i=0; i<5; i++)
printf("\t%s ", buffer_cc[i]);
printf("\n");
//How about this?
memcpy(strings, buffer, sizeof(strings));
printf("Test 2:\n");
for (i=0; i<5; i++)
printf("\t%s ", strings[i]);
printf("\n");
return 0;
}
Пожалуйста, не обращайте внимания на мое предположение о 32-битной платформе. Кроме того, если элементы не того же размера, что и uint32_t, я знаю, как дополнить их и скопировать правильное количество uint32_t. Мой вопрос посвящен тому, нарушает ли это строгий псевдоним или нет.