在CU的C/C++版看到一个例子:http://bbs.chinaunix.net/thread-3621056-1-1.html
- #include <stdio.h>
-
- struct A{
- char a;
- char b;
- int c[0];
- };
-
- struct B{
- char a;
- char b;
- int c;
- };
-
- int main()
- {
- printf("sizeof(struct A): %d\n", sizeof(struct A));
- printf("sizeof(struct B): %d\n", sizeof(struct B));
-
- return 0;
- }
结果:- digdeep@ubuntu:~/uulp$ gcc -Wall -o sizeof sizeof.c
- digdeep@ubuntu:~/uulp$ ./sizeof
- sizeof(struct A): 4
- sizeof(struct B): 8
- digdeep@ubuntu:~/uulp$
C语言在编译时的对齐规则:1)找出struct 结果体中占用内存最大的类型,在struct A,struct B中都是int。2)知道常识:编译指标器(#pragma pack(X),x86机器上默认X一般是4。3) 机器字长 (32位/64位)比较三者,按照散者中最小的来对齐。因为sizeof(int) == 4,所以struct A和struct B都是按照4字节对齐。所以:sizeof(struct A) == 4, sizeof(struct B) == 8
在struct A中应该说int c[0]并不占用内存。也就是0长度的数组不占内存。但是:数组长度虽然为0,但是却影响了结构体整体的对齐
在看一看几个例子:- #include <stdio.h>
-
- struct A{
- char a;
- char b;
- };
-
- struct B{
- char a;
- char b;
- double c;
- };
-
- struct C{
- char a;
- };
-
- struct D{
- char a;
- short c[0];
- };
-
- struct E{
- char a;
- int c[0];
- };
-
- int main()
- {
- printf("sizeof(struct A): %d\n", sizeof(struct A));
- printf("sizeof(struct B): %d\n", sizeof(struct B));
- printf("sizeof(struct C): %d\n", sizeof(struct C));
- printf("sizeof(struct D): %d\n", sizeof(struct D));
- printf("sizeof(struct E): %d\n", sizeof(struct E));
-
- return 0;
- }
结果:- digdeep@ubuntu:~/uulp$ gcc -Wall -o sizeof2 sizeof2.c
- digdeep@ubuntu:~/uulp$ ./sizeof2
- sizeof(struct A): 2
- sizeof(struct B): 12
- sizeof(struct C): 1
- sizeof(struct D): 2
- sizeof(struct E): 4
- #include <stdio.h>
sizeof
最新推荐文章于 2023-10-02 15:29:06 发布