结构体大小计算以及sizeof与strlen的区别

内存对齐这个知识点面试问的几率特别高,赶紧学一下吧,书到用时方恨少!!!

一、结构体求大小

这里主要还是联合体求大小,应为结构体大小在前面已经记录过了,本质还是内存对齐。

联合体如何求占用内存大小:

1.找到占用字节最多的成员;

2.union的字节数必须是占用字节最多的成员的字节的倍数,而且需要能够容纳其他的成员。

typedef union {
    long i;
    int k[5];
    char c;
}D

其中占用字节最大的数据类型是long,但是这里还有整型的数组,所以肯定不是8字节。因为字节数必须是占用字节最多的成员的字节的倍数,而且需要能够容纳其他的成员。

所以结果要是8的倍数,还要容纳这个数组的大小,数组大小是20,还要8的倍数,那就是24,所以union的大小就是24字节。

再看看结构体包含结构体或者数组的情况:

struct s4{undefined

    char ch;
    int i;
    struct s{undefined
        char ch1;
        int j;
};
    float f;
};

最大数据类型为4,结构体中的数据要拆开看,数据对齐后结果是20字节。

特殊情况:对齐值大于最大类型成员值

#pragma pack(10)

struct s7{undefined
    char ch;
    int i;
    float f;
    double d;
};

我们指定的对齐值是10,最大为8,是否就向10对齐?不是,当指定对齐值大于自身对齐值时,向自身对其值对齐,大小是24

二、sizeof与strlen的区别

1、性质:首先sizeof是个运算符,而strlen是一个函数。

2、功能:sizeof返回这个数据类型占用字节的大小,而strlen只是返回字符串的长度。

3、使用strlen的时候必须包含他的头文件。

4、sizeof是在编译的时候就将结果计算出来了是类型所占空间的字节数,所以以数组名做参数时计算的是整个数组的大小。而strlen是在运行的时候才开始计算结果,这是计算的结果不再是类型所占内存的大小,数组名就退化为指针了。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西邮小菜机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值