C 如何找到结构的大小?

C 如何找到结构的大小?,c,struct,sizeof,C,Struct,Sizeof,a的尺寸是多少 我假设您指的是struct而不是strict,但在32位系统上,它将是5或8个字节,这取决于编译器是否在填充struct。我怀疑您指的是'struct',不是'strict',是'char'而不是'char' 大小将取决于实现。在大多数32位系统上,指针可能是5--4个字节,字符可能是一个字节。我不相信联盟会在这里发挥作用。但是,如果交换“c”和“b”,则大小可能会增加到8字节 好的,我试过了(g++4.2.3,带-g选项),得到了8。这取决于您的体系结构以及它如何处理基本数据类

a的尺寸是多少

我假设您指的是struct而不是strict,但在32位系统上,它将是5或8个字节,这取决于编译器是否在填充struct。

我怀疑您指的是'struct',不是'strict',是'char'而不是'char'

大小将取决于实现。在大多数32位系统上,指针可能是5--4个字节,字符可能是一个字节。我不相信联盟会在这里发挥作用。但是,如果交换“c”和“b”,则大小可能会增加到8字节


好的,我试过了(g++4.2.3,带-g选项),得到了8。

这取决于您的体系结构以及它如何处理基本数据类型。这还取决于系统是否需要自然对齐

准确值为sizeof(a)。

您也可能会冒险,并假设在这种情况下,它不小于2且不大于16。

与其他一些答案所说的相反,在大多数系统上,在没有pragma或编译器选项的情况下,结构的大小将至少为6字节,在大多数32位系统上,结构的大小将至少为8字节。对于64位系统,大小很容易为16字节。对齐确实发挥了作用;总是。单个结构的大小必须确保可以分配这些大小的数组,并且数组的各个成员对于所讨论的处理器充分对齐。因此,如果结构的大小如其他人所假设的那样为5,那么由两个这样的结构组成的数组的长度将为10字节,第二个数组成员中的字符指针将在奇数字节上对齐,这将(在大多数处理器上)造成性能的主要瓶颈

struct a
{
    char *c;
    char b;
};

给出sizeof(a)==5。如果执行此操作,请小心在任何库标题之前重置打包

在32位系统上,结构的大小应为8字节,因此结构的大小应为2的倍数。这使得在声明结构数组时,单个结构在正确的字节边界处可用。这是通过在结构的末尾填充3个字节来实现的

如果该结构在char之后声明了指针,那么它的大小仍然是8字节 但是添加3字节的填充将使指针(4字节元素)在4字节地址边界处对齐


经验法则是,元素的偏移量应该是其字节大小的倍数,而结构本身的大小应该是2的倍数。

如果要手动计算,结构的大小只是考虑对齐后每个数据成员的大小。结构没有神奇的开销字节。

对齐可能发挥作用。在旧的68k Mac上,崩溃!我假设对齐不会产生影响的原因是,两个成员之间没有填充物,可以正确对齐。我没想到sizeof会在最后解释填充。正如我在对答案的编辑中所指出的那样,我的假设在实验上被推翻了。为了确保它是有效的:printf(“sizeof(a)==%d”,(int)sizeof(a));’@ThomasPadron McCarthy相当于
printf(“%zu”,sizeof(a))
。@H2CO3:是的,这也行,在一个足够现代的C.2008中,我真的很愚蠢。首先,5年前我有一台32位的机器?然后我在一个关于比特度的问题中忘记了参数大小?好东西下一个答案有一些细节。虽然理论上没有上限,因为指针的实现和大小是编译器特定的,只要它们按照标准进行操作。这是相对少见的,但只包含字符数组的结构可能有奇数大小:
struct unspecial{char a[3];char b[4];}的大小可能为7,但不会造成任何不良影响。编译器可能仍然将它填充到8字节,但是没有明显的需要。<代码> siZeof(a)< /> >无效。C.,它仍然是C++中有效的。
#include <stdio.h>

typedef struct { char* c; char b; } a;

int main()
{
    printf("sizeof(a) == %d", sizeof(a));
}
#pragma pack(1)
typedef struct { char* c; char b; } a;