深刻理解C语言结构体成员变量内存分配

欢迎点击「算法与编程之美」↑关注咱们!算法

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列博客。编程

1 问题描述数组

在学习C语言的时候,咱们都会频繁的接触到结构体,使用结构体定义新的数据类型,从而更加方便的存储数据。可是在使用结构体的时候,有些问题会常常会困扰咱们,以下所示:微信

第一种结构体定义:函数

struct school{学习

    char address[100];编码

    char name[30];3d

};指针

第二种结构体定义:教程

struct school_other{

    char *address;

    char *name;

};

以上两种结构体的定义有什么区别?咱们在使用的时候须要注意什么?

本文将和你们一块儿来深刻的探讨这个问题。

2 分析问题

不少时候对于你们来讲,最重要的不是获得问题的答案,而是学会别人是如何分析问题的,这种解决问题的思路对于你们来讲才是最重要的,也是最精彩的地方。

C语言中定义的任何一个变量,最终都会从你的内存条上拿走相应的内存空间,如定义了一个int a;那么四个字节的空间就给a这个变量了。既然如此,咱们很好奇,上述两种类型的结构体,分别占用了多大的内存空间呢?为了解决这个问题,咱们编写了如下的程序:

这个程序应该很简单,相信各位同窗都能看懂,首先定义了两个结构体类型struct school和struct school_other,而后在main函数中定义了两个变量,最后使用sizeof()函数得到变量的内存空间大小。

程序的输出结果以下:

这种输出结果不知是你们意料之中仍是意料以外呢?不管是哪一种状况,咱们一块儿来分析分析。

若是要咱们去计算第一个结构体的内存占用空间,你该如何去计算?

struct school{

    char address[100];

    char name[30];

};

因为sizeof(char)==1获得每个字符型数据占用的空间大小是一个字节,所以上述结构体占用的空间应该是:1 Byte * 100 + 1 Byte * 30 = 130 Byte,这个答案和输出的结果是一致的。

按照一样的方式咱们去计算另一个结构体的内存占用空间:

struct school_other{

    char *address;

    char *name;

};

因为sizeof(char *) == 8获得每个指针类型的数据占用的空间是八个字节,所以上述结构体占用的空间应该是:8 Byte * 1 + 8 Byte * 1 = 16 Byte,这个答案也和输出结果一致。

为何要花这么多的篇幅去介绍结构体类型空间大小呢?

貌似和主题无关,其实正是深刻理解主题的核心所在。本文定义一个school结构体的目的在于经过school结构体可以保存某个学校的地址和名称,而地址和名称都是字符数组类型,这种类型能够保存多个字符。

struct school这种结构体类型为其成员变量address和name分配了大小分别为100和30的内存空间,有了内存空间,所以能够直接使用。

而struct school_other这种结构体类型并无为其成员变量分配内存空间,所以在使用以前必须对其分配,才能够为其赋值。

上述问题,其实能够进一步简化成:

char address[100];

char* address_other;

这两种变量你们在使用时,应该注意什么?

address变量已经有了100个字节的内存空间,所以能够直接对其进行赋值,而address_other只是一个指针即只是一个内存地址,而这个地址是多少并未知晓,所以在使用以前,务必要分配内存空间,而后才能使用。

3 总结

本文介绍告终构体指针类型的成员变量和数组类型的成员变量的区别,以及在使用时应该注意的问题,帮助你们更好的理解内存分配。

更多精彩文章:

关于c语言结构体偏移的一点思考(一)

关于c语言结构体偏移的一点思考(二)

C语言教程第1讲  程序模板

C语言教程 实例 1到100求和

聊一聊编程

聊一聊栈(1)

聊一聊栈(2)

聊一聊C语言的参数传递

聊一聊整数编码

由stdout引起的思考

史上最简单易懂的二进制转换

相关文章
相关标签/搜索