История изменений
Исправление LINUX-ORG-RU, (текущая версия) :
`struct x { union { struct { int i; … char buf[]; }; }; char _[4096];
Заполнитель _[4096]
перемести внутрь union
и всё будет работать.
#include <stdio.h>
struct x {
union {
struct {
int i;
char x;
float p;
long m;
char buf[64];
};
char _[4096];
};
};
int main(int argc, char *argv[])
{
struct x y;
y.i=12;
y.x=13;
y.p=0.4;
y.buf[0]='l';
y.buf[1]='o';
y.buf[2]='\n';
printf("%zu %d %d %f %s\n",sizeof(y),y.i,y.x,y.p,y.buf);
return 0;
}
dron@gnu:~$ gcc cc.c
dron@gnu:~$ ./a.out
4096 12 13 0.400000 lo
dron@gnu:~$ gcc -g3 -c cc.c
dron@gnu:~$ pahole cc.o
struct x {
union {
struct {
int i; /* 0 4 */
char x; /* 4 1 */
/* XXX 3 bytes hole, try to pack */
float p; /* 8 4 */
/* XXX 4 bytes hole, try to pack */
long int m; /* 16 8 */
char buf[64]; /* 24 64 */
}; /* 0 88 */
char _[4096]; /* 0 4096 */
}; /* 0 4096 */
/* size: 4096, cachelines: 64, members: 1 */
};
dron@gnu:~$
Исправление LINUX-ORG-RU, :
`struct x { union { struct { int i; … char buf[]; }; }; char _[4096];
Заполнитель _[4096]
перемести внутрь union
и всё будет работать.
#include <stdio.h>
struct x {
union {
struct {
int i;
char x;
float p;
long m;
char buf[64];
};
char _[4096];
};
};
int main(int argc, char *argv[])
{
struct x y;
y.i=12;
y.x=13;
y.p=0.4;
y.buf[0]='l';
y.buf[1]='o';
y.buf[2]='\n';
printf("%zu %d %d %f %s\n",sizeof(y),y.i,y.x,y.p,y.buf);
return 0;
}
dron@gnu:~$ gcc cc.c
dron@gnu:~$ ./a.out
4096 12 13 0.400000 lo
dron@gnu:~$ gcc -g3 -c cc.c
dron@gnu:~$ pahole cc.o
struct x {
union {
struct {
int i; /* 0 4 */
char x; /* 4 1 */
/* XXX 3 bytes hole, try to pack */
float p; /* 8 4 */
/* XXX 4 bytes hole, try to pack */
long int m; /* 16 8 */
char buf[64]; /* 24 64 */
}; /* 0 88 */
char _[4096]; /* 0 4096 */
}; /* 0 4096 */
/* size: 4096, cachelines: 64, members: 1 */
};
dron@gnu:~$
Исходная версия LINUX-ORG-RU, :
`struct x { union { struct { int i; … char buf[]; }; }; char _[4096];
Заполнитель _[4096]
перемести внутрь union
и всё будет работать.