C或C中空结构体占用内存大小是多少

大家都知道在C/C++中,还有很多其它语言中,都有结构体这么个东西。也经常在C/C++面试中被结构体内存占用空间搞的头昏脑胀。今天我们先不说结构体字节对齐这个知识点,我们先来看看空结构体占用的内存大小是多大。废话不多说,上代码!

这片程序的输出是多少呢?是0吗?是1吗?是4吗?是8吗?还是说,32位系统里是4,64位系统里是8?不瞒你说,Linux里面gcc编译器编译之后,跑出来的是0.在Windows下测过,也是0.也就是说,在C语言里,空结构体是不占用内存空间的,也就是没有分配内存空间。

那么,有另外一个问题,定义一个空结构体数组,他们会分配内存空间吗?他们节点地址是多少?

没有分配内存空间的元素,会有地址吗?上面的程序输出是什么?下面的截图是程序的输出:

说明,占用内存为空的元素,也是有地址的~WTF

那么,定义是个空结构体数组呢?他们的地址一样吗?还是不同?

实验表明以下结论:

1..整个空结构体数组占用内存大小,跟一个空结构体占用内存大小是一样的,都是0,也就是说,都没有分配内存空间

2..空结构体,一个元素也好,数组也好,都有内存地址

3..空结构体数组所有元素内存地址都是一样的,也就是说,C语言中允许两个不同元素拥有相同的内存地址。

(至于这个内存地址在哪里,我们以后再讨论)

-----------------------------------------cutline---------------------------------------------------

在C++里面呢?这个情况是一样的吗?

从结果来看,在C++里,空结构体占用内存大小是1,也就是编译器给它分配了内存空间。不用想,肯定是有内存地址的了。为什么样这样呢?

据说是C++标准里面有这么一句规定:“noobjectshallhavethesameaddressinmemoryasanyothervariable”,也就是C++中不允许任何两个不同的对象拥有相同的地址。所以呢,编译器为了实现这个规定,在每一个空结构体里面都插入一个占位字符,好在内存中分配空间。(空结构体的作用很显而易见,在代码架构的初期,业务细节还没定清楚,先写好代码架构,用空结构体占位,使代码能编译通过。)根据这个推断,在C++里,空结构体数组不仅有内存地址,而且各个地址还都不一样,它们大小相差1.

可以看到,空结构体数组大小为5,每个元素都有地址,不同元素地址不同。

----------------------Theend------------------------









































北京治疗白癜风的好方法
白癜风有哪些危害



转载请注明:http://www.nydjfy.com/jbjj/956.html