文档章节

读征服C指针有感

ikel
 ikel
发布于 2013/11/10 22:43
字数 778
阅读 348
收藏 7

前提条件:32位环境

1. 指针就是地址。指针++的长度等于该类型的长度?我一直以为指针就是占四个字节的,是的,只是在使用指针做++运算时,地址的值会增加当前指针所指向数据类型的长度。指针本身会占用内存中4个字符的地址(64位系统会分配8个字符),而这4个字符的长度里面又存了指针所指向数据的地址值,所以指针可以指向复杂的数据类型。指针不能直接给值,而要给一个有值的变量或对象,因为里面要存地址,不存具体的数据。

2.空指针的地址是0x00000000?大多数环境下是这样,特殊的硬件环境可能不是。NULL只是个宏定义,一般是0.但也会是(void *)0。所以字符串的结尾不能用NULL,可能会报警告。

3.用printf看到的地址是操作系统分配的虚拟内存地址,而不是真实的物理内存地址。这样可以防止一个程序可以修改其他程序占用的内存地址。而且测试发现,同一个控制台程序,启动2次,里面变量可以显示一样的地址,但一个程序对值的修改不影响另外一个程序中的值。说明操作系统对虚拟内存中地址一样的却映射了物理内存的不同地址。

4.内存碎片化。在c中使用malloc,realloc函数向操作系统申请内存。realloc(void *p, size_t)中会把原占有内存释放掉,重新申请一块,然后把p对应的值拷贝过来。如果p=NULL,则跟malloc等效。在不断发出申请、free的过程中,是否会有很多碎片?如果能看到malloc的源代码会发现,malloc会先向操作系统申请一个大块的内存空间,然后切割成多个小块,按申请的大小切给各个调用malloc的对象,如果释放了,相邻的空闲空间会合并成一块空间。在用free之前,malloc分配的地址总是变大的,在有过free之后,malloc后的地址也许就在已用的之间。它会在最小的地址(链表的头)开始往后找空闲的能切出要求大小的空间。如果该快大的内存空间不够了,会再向操作系统申请,把新的作为原链表的最后一个数据成员。

5.内存对齐。PC机都会采用4字节对齐方式。所以结构体

typedef struct {

      int         int1;

      double   double1;

      char      char1;

      doubel  double2;

} hugo;

的大小是24.如果按照结构体的顺序把数据写入文本,遇到按8位字节对齐读取的机器的时候,就会发生错误。同时,intel,amd处理器的芯片是采用小端,就是假如4个字节的数据0x12345678存的时候是78  56 34 12.

© 著作权归作者所有

共有 人打赏支持
上一篇: 虚拟机环境设置
下一篇: 01
ikel
粉丝 5
博文 22
码字总数 9888
作品 0
浦东
程序员
私信 提问
加载中

评论(3)

ikel
ikel

引用来自“roylieu”的评论

指针就是地址加步长(类型)

地址加步长(类型)岂不是要超过4个字符了(32位机器中)
roylieu
roylieu
指针就是地址加步长(类型)
哆啦比猫
哆啦比猫
指针只记录地址,不记录额外信息(但是编译器会记录);指针可以直接给值,因为指针就是一 int (机器字长定点数)。地址也是数据。
云风开发笔记 (5) : 场景服务及避免读写锁

这周我开始做场景模块。因为所有 PC 在 server 端采用独立的 agent 的方式工作。他们分离开,就需要有一个模块来沟通他们。在一期目标中,就是一个简单的场景服务。用来同步每个 agent 看到的...

亚历山大痒
2013/03/17
0
0
备忘:fopen()和fclose()的用法

open()和fclose()的用法 1.fopen()函数的用法 fopen函数用于打开文件, 其调用格式为: FILE fopen(char filename, *type); fopen()函数中第一个形式参数表示文件名, 可以包含路径和文件名两部...

berryz2007
2010/12/12
0
0
没有突破等于等待死亡

软件技术有瓶颈,如果找到突破的方向超越别人才能维持竞争力,否则你就是路人甲,但,软件技术又太难提升,尤其工作了2年之后,工作中要用到的技术差不多都掌握了,每个人差别不是很大,但若...

快速开发师
2017/07/05
304
2
VR体验有多真?有人玩着玩着摔倒了

玩VR游戏之前,还得确保活动范围内的安全。 近期,《星际迷航》演员乔治·武井(George Takei)在Facebook帐号上分享的一段视频显示,一名男子试图在Oculus头戴设备中征服一座虚拟山峰,但最...

行者武松
2018/03/01
0
0
C语言scanf函数详细解释

函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类...

晨曦之光
2012/03/09
47K
1

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
10
3
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
4
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
5
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
5
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部