数组的内存布局

简介:

先看下面的例子:

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,如需转载请自行联系原作者

相关文章
|
2月前
|
存储 算法 Oracle
不好意思!耽误你的十分钟,JVM内存布局还给你
先赞后看,南哥助你Java进阶一大半在2006年加州旧金山的JavaOne大会上,一个由顶级Java开发者组成的周年性研讨会,公司突然宣布将开放Java的源代码。于是,下一年顶级项目OpenJDK诞生。Java生态发展被打开了新的大门,Java 7的G1垃圾回收器、Java 8的Lambda表达式和流API…大家好,我是南哥。一个Java学习与进阶的领路人,相信对你通关面试、拿下Offer进入心心念念的公司有所帮助。
不好意思!耽误你的十分钟,JVM内存布局还给你
|
4天前
|
编译器 Linux API
基于类型化 memoryview 让 Numpy 数组和 C 数组共享内存
基于类型化 memoryview 让 Numpy 数组和 C 数组共享内存
12 0
|
4天前
|
存储 安全 Linux
将文件映射到内存,像数组一样访问
将文件映射到内存,像数组一样访问
11 0
|
1月前
crash —— 获取物理内存布局信息
crash —— 获取物理内存布局信息
|
2月前
|
缓存 Java 编译器
Go 中的内存布局和分配原理
Go 中的内存布局和分配原理
|
2月前
|
存储 编译器 C++
Method&ConstMethod的内存布局
综上所述,常规方法和常量方法在对象的内存布局中并不直接占据空间;它们作为代码的一部分存储在程序的代码段中。对于虚方法(包括常量虚方法),它们通过VTable在对象中有表示,但即便在这种情况下,方法代码本身也不在对象的内存布局中。理解这些概念有助于深入理解面向对象编程,提高编程效率和代码的可理解性。
31 3
|
3月前
|
存储 缓存 算法
(五)JVM成神路之对象内存布局、分配过程、从生至死历程、强弱软虚引用全面剖析
在上篇文章中曾详细谈到了JVM的内存区域,其中也曾提及了:Java程序运行过程中,绝大部分创建的对象都会被分配在堆空间内。而本篇文章则会站在对象实例的角度,阐述一个Java对象从生到死的历程、Java对象在内存中的布局以及对象引用类型。
|
2月前
|
存储 NoSQL 程序员
C语言中的内存布局
C语言中的内存布局
38 0
|
3月前
|
编译器 C++
sizeof之谜与内存布局探秘
【7月更文挑战第18天】`sizeof`之谜与内存布局探秘: 在 C 和 C++ 中,`sizeof` 操作符用于确定类型或变量的字节数。基本类型如 `int` 的大小由编译器和平台决定。结构体因内存对齐可能使其实际大小大于成员总和,例如 `int` 可能按 4 字节对齐。数组的 `sizeof` 返回整个数组的内存空间。理解 `sizeof` 和内存布局有助于避免内存浪费和缓冲区溢出问题,确保程序高效可靠。
|
4月前
|
监控 Linux 数据处理
探索Linux中的`lsmem`命令:深入了解系统内存布局
`lsmem`是Linux命令,用于显示系统内存布局和大小,帮助管理员和开发者理解内存使用情况。它提供详细输出,包括内存块的大小、范围、类型和关联,支持多种格式展示,如树状图。命令参数如`-h`显示帮助,`-t`以树形展示,`--human-readable`使大小更易读。需root权限运行,常与`free`、`vmstat`等工具结合使用,用于监控和优化内存。注意不同发行版可能存在兼容性差异。

热门文章

最新文章

下一篇
无影云桌面