C++ 此结构的大小相加不正确

C++ 此结构的大小相加不正确,c++,struct,sizeof,C++,Struct,Sizeof,可能重复: 我编写了一个程序来查找以下结构abc的大小 a。内置的sizeof()操作符提到这个结构的大小是40,而实际上是32?我还尝试减去地址来确定这一点,结果也是40 b。当我在结构abc中注释掉“char g[3];”时,abc的大小为32。 这对我来说也没有任何意义。这不是28岁吗 c。为什么我需要转换为“unsigned int”?如果不执行强制转换,则会收到以下编译错误消息。&a[0]实际上不是地址吗(应该是int) _struct的size\u struct.cpp的size

可能重复:

我编写了一个程序来查找以下结构abc的大小

a。内置的sizeof()操作符提到这个结构的大小是40,而实际上是32?我还尝试减去地址来确定这一点,结果也是40

b。当我在结构abc中注释掉“char g[3];”时,abc的大小为32。 这对我来说也没有任何意义。这不是28岁吗

c。为什么我需要转换为“unsigned int”?如果不执行强制转换,则会收到以下编译错误消息。&a[0]实际上不是地址吗(应该是int)

_struct的size\u struct.cpp的size\u(24):错误C2440:“=”:无法从“abc*”转换为“unsigned int”

信息: 我正在运行Win7,64位系统。微软visual studio编译器

#include <iostream>

struct char_three{
    char a[3];
};

struct int_three{
    int a[3];
};

struct abc 
{
    int a; // 4 bytes
    double b; // 8
    void *ptr; // 4
    char g[3]; // 4 due to padding ?
    int c[3]; // 12
}; // Total size of struct - 31 / 32.

int main () 
{
    abc a[2]; 
    unsigned int add0, add1;
    add0 = (unsigned int) &a[0];
    add1 = (unsigned int) &a[1];
    printf("add1 of a is :%x add0 is :%x\n", add1, add0);

    printf("size of struct abc : %d\n", add1-add0);
    printf("size of int: %d\n", sizeof(int));
    printf("size of double: %d\n", sizeof(double));
    printf("size of void ptr: %d\n", sizeof(void *));
    printf("size of 3 char: %d\n", sizeof(char_three));
    printf("size of 3 int: %d\n", sizeof(int_three));
    printf("size of a: %d\n", sizeof(a));
    system("pause");
    return 0;
}

O/P:
add1 of a is :51f828 add0 is :51f800
size of struct abc : 40
size of int: 4
size of double: 8
size of void ptr: 4
size of 3 char: 3
size of 3 int: 12
size of a: 80
Press any key to continue . . .
#包括
结构字符三{
chara[3];
};
结构int_三{
int a[3];
};
结构abc
{
int a;//4字节
双b;//8
void*ptr;//4
字符g[3];//4是否由于填充?
int c[3];//12
}; // 结构的总大小-31/32。
int main()
{
abca[2];
无符号整数add0,add1;
add0=(无符号整数)&a[0];
add1=(无符号整数)&a[1];
printf(“地址1是:%x地址0是:%x\n”,地址1,地址0);
printf(“结构abc的大小:%d\n”,add1-add0);
printf(“int的大小:%d\n”,sizeof(int));
printf(“双精度的大小:%d\n”,sizeof(双精度));
printf(“无效ptr的大小:%d\n”,sizeof(void*);
printf(“3个字符的大小:%d\n”,sizeof(char_三));
printf(“3 int的大小:%d\n”,sizeof(int_三));
printf(“a的大小:%d\n”,sizeof(a));
系统(“暂停”);
返回0;
}
O/P:
a的地址1为:51f828地址0为:51f800
结构abc的大小:40
整数的大小:4
双人间尺寸:8
空隙尺寸ptr:4
3个字符的大小:3
大小为3英寸:12
a的尺寸:80
按任意键继续。

不能明确依赖结构的sizeof()。它的实现定义了编译器是否引入填充,如果是,在哪里引入。如果您使用的是与GCC兼容的编译器,并且不介意其他工具链(等等,还有其他工具链吗?),那么您可以使用
\uuuuuuu attribute\uuuuuu((打包))
告诉编译器根本不要在结构中添加填充。

阅读关于填充的内容。您可以对各种成员变量的地址执行指针算术,以查看编译器添加填充的位置。仅供参考,在MS编译器上,
pragma warning(默认值:4820)将启用一个警告,指示在结构的中间添加填充,但填充也添加到结构的末尾,因此结构的数组将保持对齐的访问。在本例中,在末尾添加了4个字节以使总大小为40,因此在这种结构的数组中,双精度始终是8字节对齐的。