文档章节

读征服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
如果程序员是士兵,那编程语言会是什么样的武器?

如果程序员是士兵,那 C、C++、汇编、PHP、Perl、Python、JavaScript、Java、Scala、ActionScript、Objective-C、Swift、Go、Ruby 等编程语言 会是什么样的武器呢?本文摘编自 Chandra Penk...

两味真火
2016/10/01
4.1K
15
oracle体系结构学习笔记《一》

体系结构和备份恢复原理 1 oracle database 最重要的是online redo log 类比法 controlfile :公司高管 datafile :生产车间 online redo log:财务处 注释: system表空间是第一生产车间; ...

长平狐
2012/09/19
37
0
VR体验有多真?有人玩着玩着摔倒了

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

行者武松
03/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

中高级面试知识点:缓存

前言 几乎所有的项目都做了缓存,但是缓存做的怎么样,其实只有我们自己知道。缓存做的好,没有网络也能流畅的使用;再多的数据请求都不会出现卡顿延迟等待很久的情况。 程序中除了图片缓存(...

Mr_zebra
16分钟前
1
0
Poco官方PPT_190-Applications双语对照翻译

因工作需要用到这一块的功能,所以直接翻译了一下 此PPT来源于官方文件,地址https://pocoproject.org/documentation.html

CHONGCHEN
20分钟前
1
1
使用idea开发servlet,引用maven后触发的class not found的问题的解决方案

需要将maven下载的依赖加入到lib目录,具体操作方法如下:打开Projrct Settings->Artifacts->右边的Output Layout,双击maven的依赖,就可以加载上去...

shatian
22分钟前
1
0
SpringMVC 拦截器

拦截器 是指通过统一拦截从浏览器发往服务器的请求来完成功能的增强 SpringMVC拦截器实现过程 1.编写拦截器,实现 org.springframework.web.servlet.HandlerInterceptor 接口 2.将拦截器注册...

晨猫
24分钟前
1
0
RabbitMQ+PHP演示实例

新建rabbit_consumer.php作为消费者 <?php //配置信息 $conn_args = array( 'host' => '127.0.0.1', 'port' => '5672', 'login' => 'admin', 'password' => ......

hansonwong
25分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部