C语言结构体对齐存储问题以及给结构体中的数组的赋值问题

最近在看鸡啄米关于c++的教程,偶然发现了结构体中两个好玩的东西。

首先是结构体成员如果是字符数组,该怎么赋值?

以一个结构体为例:

    struct si{
        char x[5];
        char y;
        float z;
        double m;
    }su;

我用的su.x="abcd"和直接在定义是初始化,均报错。后来经过搜索发现有三种方法:

    第一种是用for循环一个一个元素的赋值;

    第二种是用strcpy(su.x,"abcd")赋值;

    第三章是用memcpy(su.x,"abcd",4)赋值。

然后就是激动人心的结构体在内存中的存储方式了。

C语言中结构体的存储方式是采用对齐的方式,目的是提高访问内存的效率。但是,结构体是怎样对齐的呢?

就是变量的存放地址应该能够整除变量的字节数。4字节的变量应该存放在可以被4整除的地址上,8字节同理。

在上述例子中,x存放在0~4上;y存放在5上;z为floa型变量,大小为4字节,所以应该对齐存放在能够被4整除的地址上,为8~11;同理,m为double型变量,大小为8字节,所以应该对齐存放在能够被8整除的地址上,为16~23。综合上面的,该结构体的大小应该为24。

所以,想必大家也就看出来了,struct结构体的存储顺序是会影响存储空间的使用率的。虽然最近经常听到的说法是现在的存储越来越低廉,因此在编码的时候可以不那么在意存储空间的使用率,把更多的精力放在提高程序的运行时间。但是真的是这样吗?我觉得现在随便一个啥数据量都那么大,节约存储空间还是必不可少的。所以在以后定义结构体时,要尽量把相同数据类型的变量连续写才比较好~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值