Это легко и просто компилируется. Нет ошибки сегментации. Каков именно вывод вашего компилятора?
Здесь вы можете увидеть:
#include <stdio.h>
int main()
{
int *ptr_var;
union
{
char arr[10];
int var;
} u;
u.arr[0]='A';
u.arr[9]='\0';
ptr_var = (int*) &u.arr[1];
*ptr_var = 0x2a;
printf("%s\n", u.arr);
printf("%d(d)=%x(x)\n",u.var, u.var);
}
И ответ:
cpp/test/temp$ gcc union.c -o union
cpp/test/temp$ ./union
A*
10817(d)=2a41(x)
cpp/test/temp$ gcc --version
gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Это прекрасный способ перемещать биты. Возможно, ваш segfault находится в другой области программы. Смотрите этот тест:
*ptr_var = 0x10;
printf("%d(d)=%x(x)\n",u.var, u.var);
ptr_var = (int*) &u.arr[1];
*ptr_var = 0x10;
printf("%d(d)=%x(x)\n",u.var, u.var);
ptr_var = (int*) &u.arr[2];
*ptr_var = 0x10;
printf("%d(d)=%x(x)\n",u.var, u.var);
И вы получите:
16(d)=10(x)
4112(d)=1010(x)
1052688(d)=101010(x)
Береги себя,
Беко.