数组的内存布局

简介:

先看下面的例子:

1
int  a[ 5 ];

 

1.内存布局的示意图


所有人都明白这里定义了一个数组,其包含了5个int型的数据。我们可以用a[0],a[1]等来访问数组里面的每一个元素,那么这些元素的名字就是a[0],a[1]…吗?看下面的示意图:

如上图所示,当我们定义一个数组a时,编译器根据指定的元素个数和元素的类型分配确定大小(元素类型大小*元素个数)的一块内存,并把这块内存的名字命名为a。名字a一旦与这块内存匹配就不能被改变。a[0],a[1]等为a的元素,但并非元素的名字。数组的每一个元素都是没有名字的。

 

2.利用sizeof来研究数组的内存结构关系

 

  那现在再来解决sizeof关键字时的几个问题(本文最下方的参考书): (我想起了王泽梁老师给我们上数据结构课时,介绍数据类型data type的概念:定义了一些数据data,以及基于这些数据的操作operation。)

1
2
sizeof(a)的值为sizeof( int )* 5 32 位系统下为 20
sizeof(a[ 0 ])的值为sizeof( int ), 32 位系统下为 4 。<br>sizeof(a[ 5 ])的值在 32 位系统下为 4

  

  sizeof(a[5])的值在32位系统下为4。并没有出错,为什么呢?

  因为这里肯定没有访问a[5]这个元素,sizeof只是获取a[5]类型,而对于a[5]的内容不感兴趣。

  sizeof是关键字不是函数。函数求值是在运行的时候,而关键字sizeof求值是在编译的时候。虽然并不存在a[5]这个元素,但是这里也并没有去真正访问a[5],而是仅仅根据数组元素的类型来确定其。所以这里使用a[5]并不会出错。

1
sizeof(&a[ 0 ])的值在 32 位系下为 4 ,这很好理解。取元素a[ 0 ]的首地址。计算a[ 0 ]的首地址的长度。
1
sizeof(&a)的值在 32 位系统下也为 4 ,这也很好理解。计算数组a[]的首地址的长度。陈正冲老师VC++老师上做了测试,结果是 20

 

3. 省政府和市政的区别----&a[0]和&a的区别

 

  数组首地址 VS 数组首元素的首地址

  湖南的省政府所在地  VS 长沙的市政府所在地

  这里&a[0]和&a到底有什么区别呢?a[0]是一个元素,a是整个数组,虽然&a[0]和&a的值一样,但其意义不一样。前者是数组首元素的首地址,而后者是数组的首地址。举个例子:湖南的省政府在长沙,而长沙的市政府也在长沙。两个政府都在长沙,但其代表的意义完全不同。这里也是同一个意思。

 

  这个经典例子来源陈正冲老师。

 

 本文转自二郎三郎博客园博客,原文链接:http://www.cnblogs.com/haore147/p/3647211.html,如需转载请自行联系原作者

相关文章
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
420 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
12月前
|
机器学习/深度学习 人工智能 缓存
【AI系统】推理内存布局
本文介绍了CPU和GPU的基础内存知识,NCHWX内存排布格式,以及MNN推理引擎如何通过数据内存重新排布进行内核优化,特别是针对WinoGrad卷积计算的优化方法,通过NC4HW4数据格式重排,有效利用了SIMD指令集特性,减少了cache miss,提高了计算效率。
399 3
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
Rust 安全 Java
内存数组越界
【10月更文挑战第14天】
272 1
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
221 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
存储 Java
深入理解java对象的内存布局
这篇文章深入探讨了Java对象在HotSpot虚拟机中的内存布局,包括对象头、实例数据和对齐填充三个部分,以及对象头中包含的运行时数据和类型指针等详细信息。
137 0
深入理解java对象的内存布局
|
存储 算法 Oracle
不好意思!耽误你的十分钟,JVM内存布局还给你
先赞后看,南哥助你Java进阶一大半在2006年加州旧金山的JavaOne大会上,一个由顶级Java开发者组成的周年性研讨会,公司突然宣布将开放Java的源代码。于是,下一年顶级项目OpenJDK诞生。Java生态发展被打开了新的大门,Java 7的G1垃圾回收器、Java 8的Lambda表达式和流API…大家好,我是南哥。一个Java学习与进阶的领路人,相信对你通关面试、拿下Offer进入心心念念的公司有所帮助。
134 0
不好意思!耽误你的十分钟,JVM内存布局还给你
|
存储 安全 Linux
将文件映射到内存,像数组一样访问
将文件映射到内存,像数组一样访问
221 1
|
缓存 Java 编译器
Go 中的内存布局和分配原理
Go 中的内存布局和分配原理