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

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hola_f/article/details/51829528

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

展开阅读全文

没有更多推荐了,返回首页