疯狂的数组名与 大小端存储

原创 2011年01月15日 21:29:00

先来看一段代码

有兴趣的朋友可以来猜测下 输出的值会是多少 =.=~

给出答案 "5 2000000"

 

这里面涉及了 关于C数组名的含义问题 大小端存储结构

首先来说第一个 ptr1

它是用来讲述 C数组名的含义

我们知道 数组名a 代表的是 数组a的首地址

假如 a 的地址是 0x0012FF6C

那么 ptr1 = (int*)(&a) ptr1的值也是 0x0012FF6C

但是 ptr1 = (int*)(&a + 1) ptr1的值却是 0x0012FF80

我们也顺便看看内存情况吧

简单说说吧 从 0x0012FF6C 开始 是数组 int a[5]

里面分别存着值 1, 2, 3 ,4 ,5 可以看见哈~

0x0012FF80 存储了 数组a的首地址 a[0] 0x0012FF6C

ptr1的值变成了 0x0012FF80

你能想明白为什么吗?

 

其实 数组名a 还有一层含义

简单地这样来打个比方

const int *a;

a = (int*) malloc (5 * sizeof(int));

这就是我们的 int a[5] 的另一种版本

可以看出 数组名a 还有一层含义是 管辖了它自己所属的区域

&a + 1 可不是简简单单的 0x12FF6C + 1

也不是 0x12FF6C + 4(int)

而是 0x12FF6C + <数组a的范围>   

0x12FF6C + 5*(int)    -> 0x12FF6C + 0x14 = 0x12FF80

所以 数组名a 在最初分配空间时 也是给定了它的区域

&a + 1 中的 +1 则是 跨度数组名a 所管辖的空间大小

所以 ptr1 现在指向 0x0012FF80

如果输出 *ptr1 则是 0x0012FF6C

而最后的 ptr[-1] 便是 0x0012FF80 - 4(int) = 0x0012FF7C

0x0012FF7C 所存的值便是 我们得到的 5

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

 

然后是第二个 ptr2

输出为 2000000 很多人会觉得很奇怪 自己明明并没有存这个值啊

所以要简单得了解下 关于大端和小端存储模式



我们来看看内存情况 再来分析

我的CPU是AMD的 从图中也可以看出是采用的小端存储模式

ptr2 = (int*)((int)a + 1)

首先(int)a 也就是 数组a的首地址

但这里注意 &a(int)a 的意义不同 所以导致 +1 的意义也不同

(int)a 的值是 0x0012FF6C 即指向 a[0]

a[0] 的值是 1 内存分布的情况是

0x0012FF6A 00 00 01 00 00 00 02 00 00 00 03

然后 (int)a + 1 并没有第一种情况的区域跨度 只是简单地 +1Byte

所以 (int)a + 1 0x0012FF6C + 1 = 0x0012FF6D

因为是指向的地址 连续取 4Byte 作为值

ptr2 现在指向的内存情况是

0x0012FF6A 00 00 01 00 00 00 02 00 00 00 03

因为是小端存储结构

所以输出自然成了 2000000


 

逆向工程 疯狂滴数组名 和 大小端存储

先来看下面一段代码 #include int main(void) {      int a[5] = {1, 2, 3, 4, 5};      int *ptr1 = (int*)(&...
  • yangyao15897726
  • yangyao15897726
  • 2011年10月07日 16:06
  • 179

关于大小端存储

开头讲个有关大端小端的故事:   端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被...
  • AaronIn
  • AaronIn
  • 2012年06月28日 21:27
  • 4649

数组和大小端存储

博文出处:http://hi.baidu.com/casperkid/item/8e7b8f6d2efc910ea1cf0f8b   先来看下面一段代码 #include int main(...
  • u012802999
  • u012802999
  • 2013年12月06日 15:58
  • 381

调试 C 疯狂滴数组名 和 大小端存储

先来看下面一段代码 复制内容到剪贴板 代码: #include int main(void) {      int a[5] = {1, 2, 3, 4, 5};      ...
  • poweruser5956
  • poweruser5956
  • 2011年10月10日 10:32
  • 434

关于文件、网络传输以及内存存储的大小端问题

我理解的大小端应该指的是一种存储方式,而且仅对于大于1个byte的short型,word型等变量的存储有意义。 对于一个文件来讲,在大端和小端的处理器上是没有区别的,都是按顺序排列的字节流;但当该文...
  • musicnbeer7
  • musicnbeer7
  • 2016年03月11日 17:20
  • 752

存储的大小端问题

对于存储器的大小端问题困扰了自己很久了,所以查阅了相关的资料对其有了一定的了解,所以写了这篇博客做下简单的总结。 对于内存,我在这就不给予解释了,相信网上有很多相关的文章,现在让我们进入正题吧! ...
  • love131452098
  • love131452098
  • 2016年03月18日 13:56
  • 352

内存的字节存储大小端问题(一)

Big-endian和little-endian是描述排列存储在计算机内存里的字节序列的术语。 Big-endian是一种大值的一端(序列中更典型值)存在前面(在最小的存储地址)的顺序。Little-...
  • suxinpingtao51
  • suxinpingtao51
  • 2013年09月18日 16:31
  • 3148

计算机存储的大小端模式解析

文章参考地址:http://www.cnblogs.com/kubixuesheng/p/4107060.html http://blog.csdn.net/hackbuteer1/article/...
  • u014097230
  • u014097230
  • 2016年11月27日 15:40
  • 282

单片机大小端问题

大端格式:字数据的高字节存储在低地址,而字数据的低字节则存储在高地址(数组第一字节存的是最大值)。 51单片机   小端格式:高存高地址,低存低地址(数组第一字节存的是最小值)。 AVR   PIC ...
  • j182010
  • j182010
  • 2016年09月27日 10:12
  • 423

ARM存储器的大小端存储方式

大端格式和小端格式是两种存储字数据的方法。具体讲是在ARM体系的嵌入式系统结构中存储器存放数据的两种叫法,在嵌入式体系结构中将存储器看作是从零地址开始的字节的线性组合。从第0~3字节放置第一个存储的字...
  • csshuke
  • csshuke
  • 2014年09月08日 10:31
  • 587
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:疯狂的数组名与 大小端存储
举报原因:
原因补充:

(最多只允许输入30个字)