数组和大小端存储
来源:互联网 发布:4g网络的主要网络节点 编辑:程序博客网 时间:2024/05/17 01:03
博文出处:http://hi.baidu.com/casperkid/item/8e7b8f6d2efc910ea1cf0f8b
先来看下面一段代码
#include <stdio.h>
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int *ptr1 = (int*)(&a + 1);
int *ptr2 = (int*)((int)a + 1);
printf("%x %x\n", ptr1[-1], *ptr2);
return 0;
}
有兴趣的朋友可以来猜测下 输出的值会是多少 =.=~
给出答案 "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 可以看见哈~
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
- 数组和大小端存储
- 逆向工程 疯狂滴数组名 和 大小端存储
- 调试 C 疯狂滴数组名 和 大小端存储
- 疯狂的数组名与 大小端存储
- 存储大小端问题
- 大小端存储问题
- 大小端存储问题
- 大小端存储模式
- 关于大小端存储
- 存储大小端问题
- 大小端模式存储
- 大小端存储判断
- 大小端存储复习题
- 大小端存储模式
- 数据存储大小端
- 浅谈大小端存储
- 大小端存储
- 大小端存储
- sql 更新表字段(字符串)中某个序列字符
- 第十五周项目四:多课成绩单
- Struts1 和 Struts2 的区别
- 一个led控件
- BOOST库介绍,安装
- 数组和大小端存储
- Struts1 和 Struts2 比较
- 近期learning task
- 通常的的linux系统安全作法
- 林业系统功能需求
- pthon学习之小例子
- APACHE配置文件中文详解
- Tomcat(免安装版)的安装与配置
- 【Unity3D】【NGUI】UIScrollBar