C语言学习笔记之奇怪的地址问题
来源:互联网 发布:淘宝宝贝怎么靠前 编辑:程序博客网 时间:2024/06/08 00:11
比较下两段程序的输出
#include <stdio.h>int main(){ char c = 'A'; int a = 10; printf("a=%p\n", &a); printf("c=%p\n", &c); return 0;}输出:
#include <stdio.h>int main(){ int a = 10; char c = 'A'; printf("a=%p\n", &a); printf("c=%p\n", &c); return 0;}输出:
---------解答--------
这个要涉及到内存对齐了。简单来说,就是为了放置变量的二次访问。操作系统在访问内存时,每次读取一定的长度(64位系统默认为8字节)。
分析下这两种情况:
no.1、定义的char类型得到内存空间地址是0x7fff5e706c6b,如果不对齐的话,那么分配后面int类型变量的空间就是0x7fff5e706c6a--0x7fff5e706c67这四个字节空间了,那么要读取int型变量就会先读取0x7fff5e706c60--0x7fff5e706c67空间的内容,再读取0x7fff5e706c68--0x7fff5e706c6f空间的内容才能得到int类型变量的值,这就是二次读取了。而使用内存对齐来避免二次读取,将后面的int类型变量空间分配到0x7fff5e706c60--0x7fff5e706c67空间就可以避免,int类型占用4字节空间,即0x7fff5e706c67--0x7fff5e706c64.于是就有了这个结果。
no.2、这个就简单了,int类型变量分配到空间0x7fff5de52c68,系统读取0x7fff5e706c68--0x7fff5e706c6f空间内容,一次性获得int型变量的值;后来的char类型分配的空间0x7fff5de52c67,系统读取0x7fff5e706c60--0x7fff5e706c67空间内容,也是一次性读取获得值。
内存对齐可以用一句话来概括:“数据项只能存储在地址是数据项大小的整数倍的内存位置上”
例如int类型占用4个字节,地址只能在0,4,8等位置上。
(以上是一个同学的解答,我觉得是正确的)
- C语言学习笔记之奇怪的地址问题
- C语言学习笔记----奇怪的数据类型
- C语言的一个奇怪的问题?
- 奇怪的c语言
- C语言学习笔记----伊能C语言学习笔记----指针与地址的区别是什么?
- c语言学习笔记4之c语言的规则
- 奇怪的c语言声明
- 奇怪的C语言代码
- 奇怪的C语言写法
- 奇怪的C语言表达式
- C语言知识点学习之地址参数
- C语言经典问题学习笔记之二
- jQuery学习笔记——奇怪的问题
- 黑马程序员---C语言学习笔记之变量地址获取及存储原理
- 《C++ primer》学习笔记之十九:奇怪的数组引用
- 奇怪的问题之cpu
- 数据结构 学习笔记之:顺序栈的C语言实现
- C语言学习笔记之常用的字符串处理函数
- UVa 10194 足球
- 使用FileUtils简化你的文件操作
- 如何进行嵌入式开发
- springMVC JSON的接受和发送
- 【Cocos2d-x】cocos2d-x + socket
- C语言学习笔记之奇怪的地址问题
- hdu2095
- 判断滑动方向UITableView
- Sublime分屏配置
- Problem : 1002 ( A + B Problem II )
- 在eclipse中增加myeclipse的插件
- UISearchBar 自定义,加背景,取消按钮背景
- 基数排序
- 自己动手写操作系统 第六章 号外:中断处理流程详细分析