如何找到结构的大小?

27 c struct sizeof

struct a
{
    char *c;
    char b;
};
Run Code Online (Sandbox Code Playgroud)

sizeof(a)是什么?

Sim*_*han 33

#include <stdio.h>

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

int main()
{
    printf("sizeof(a) == %d", sizeof(a));
}
Run Code Online (Sandbox Code Playgroud)

我在32位机器上得到"sizeof(a)== 8".结构的总大小将取决于打包:在我的情况下,默认打包为4,因此'c'需要4个字节,'b'需要一个字节,剩下3个填充字节将它带到下一个4的倍数:8.如果你想改变这种打包方式,大多数编译器都有办法改变它,例如,在MSVC上:

#pragma pack(1)
typedef struct { char* c; char b; } a;
Run Code Online (Sandbox Code Playgroud)

给sizeof(a)== 5.如果这样做,请小心在任何库头之前重置打包!

  • 为了确保它有效:printf("sizeof(a)==%d",(int)sizeof(a));' (3认同)
  • @ThomasPadron-McCarthy 而是 `printf("%zu", sizeof(a))`... (2认同)

Jon*_*ler 9

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


Jef*_*ard 5

如果要手动对其进行计数,则结构的大小仅是考虑对齐后其每个数据成员的大小。结构没有魔术开销字节。


Cod*_*ous 0

我假设您指的是结构而不是严格的,但在 32 位系统上它将是 5 或 8 个字节,具体取决于编译器是否填充结构。