深入探索C语言之结构体(struct)


结构(struct)就是一种把一些数据项组合在一起的数据结构,其他语言把它称做为记录(record)。语法为将需要组合的内容放在花括号中,前面加上一个关键字struct,如下:

struct{内容...};

1.怎样定义结构体变量:

举个具体的例子,如将在校学生的信息定义为一个结构体,信息内容包括学生的姓名(string)、学号(long)、年龄(int)等,就可以声明如下:

结构体本质是一种数据类型,和C语言的内置内型(char,int,long...)类似,我们可以用它来定义变量,如定义一个学生Jack就可以这样:

如还要再定义一个学生Rose

我们就发现每次定义一个这样的结构体变量非常麻烦,每次都要将结构体类型声明完整写一遍,于是就引进了在struct关键字后面加上“结构标签”,例如上面的结构体就可声明为:

从此定义变量可以这样完成:

structstuInfoJack;

structstuInfoRose;

如果你还嫌略为麻烦,C语言中还可以通过关键字typedef对类型重命名,这样我们可以将上面的结构体重新命一个名字,如叫sInfo

typedefstructstuInfosInfo;

定义变量将变得异常简单:

将上面几步融合一起,就是我们通常所使用的定义结构体变量的方法:

先声明一个结构体:

再定义变量:


2. 结构体的对齐问题:

先看一个例子:

输出的结果为128,也许你比较奇怪了,两个结构体的内容完全相同,只不过位置有点不同,为什么它们所占的内存的大小就不一样呢?这其中就涉及到结构体对齐的问题。下面是两个结构体元素在内存中分布示意图:

-- -- -- --    -- -- -- --

C1|  |  |   I

-- -- -- -- -- -- -- --

    I C1|C2|  |  

-- -- -- -- -- -- -- --

C2|  |  | Foo2

-- -- -- --

Foo1

也许你会有疑问为什么不将foo1元素组织成下面这样:

-- -- -- --   

C1|     I 

-- -- -- --

  |C2| |  

-- -- -- --

如果此时要访问i,给出i的地址,要通过两次访存,还要进行一定的运算才能准确地取到i的值。因此在组织结构体的数据时,都会遵守对齐的原则:元素从其类型大小的整数倍的地址位置开始存放。这样就解释了上述foo1的大小为12的原因了。

这也告诉我们,以后写结构体时,尽量将同类型的数据放在一起,这样会节省内存分配的空间。


未完待续......

优质内容筛选与推荐>>
1、Game of Life
2、Alibaba Cloud Toolkit 一键部署插件使用入门
3、oracle 基础 创建表空间并分配用户权限
4、week6 作业
5、ov9650摄像头驱动之——linux内核v4l2架构分析3


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号