sizeof

  1. 在CU的C/C++版看到一个例子:http://bbs.chinaunix.net/thread-3621056-1-1.html

    1. #include <stdio.h>

    2. struct A{
    3.         char a;
    4.         char b;
    5.         int c[0];
    6. };

    7. struct B{
    8.         char a;
    9.         char b;
    10.         int c;
    11. };

    12. int main()
    13. {
    14.         printf("sizeof(struct A): %d\n", sizeof(struct A));
    15.         printf("sizeof(struct B): %d\n", sizeof(struct B));

    16.         return 0;
    17. }
    结果:
    1. digdeep@ubuntu:~/uulp$ gcc -Wall -o sizeof sizeof.c
    2. digdeep@ubuntu:~/uulp$ ./sizeof
    3. sizeof(struct A): 4
    4. sizeof(struct B): 8
    5. 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,但是却影响了结构体整体的对齐

    在看一看几个例子:
    1. #include <stdio.h>

    2. struct A{
    3.         char a;
    4.         char b;
    5. };

    6. struct B{
    7.         char a;
    8.         char b;
    9.         double c;
    10. };

    11. struct C{
    12.         char a;
    13. };

    14. struct D{
    15.         char a;
    16.         short c[0];
    17. };

    18. struct E{
    19.         char a;
    20.         int c[0];
    21. };

    22. int main()
    23. {
    24.         printf("sizeof(struct A): %d\n", sizeof(struct A));
    25.         printf("sizeof(struct B): %d\n", sizeof(struct B));
    26.         printf("sizeof(struct C): %d\n", sizeof(struct C));
    27.         printf("sizeof(struct D): %d\n", sizeof(struct D));
    28.         printf("sizeof(struct E): %d\n", sizeof(struct E));

    29.         return 0;
    30. }
    结果:
    1. digdeep@ubuntu:~/uulp$ gcc -Wall -o sizeof2 sizeof2.c
    2. digdeep@ubuntu:~/uulp$ ./sizeof2
    3. sizeof(struct A): 2
    4. sizeof(struct B): 12
    5. sizeof(struct C): 1
    6. sizeof(struct D): 2
    7. sizeof(struct E): 4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值