有趣的printf
来源:互联网 发布:高维数据可视化 编辑:程序博客网 时间:2024/06/11 18:00
sbrk()是linux上malloc的实现中用到的一个函数,sbrk(0)返回的是当前break的地址,今天我无意中多次打印sbrk(0)的值,发现结果和预想中的不太一样
printf("%p\n", sbrk(0));printf("%p\n", sbrk(0));printf("%p\n", sbrk(0));printf("%p\n", sbrk(0));
运行这段代码,打印出来的却是
0x218b1900x21ad0000x21ad0000x21ad000
很奇怪的一件事情,难道这四个输出不应该是一样的么?为什么第一个和其他的不同而剩下的几个相同呢?于是google了一下,虽然没有找到一样的,但是在stackoverflow找到一个差不多情况的帖子,那个人用sbrk申请了一个小空间,但是捣鼓捣鼓打印出来之后发现实际申请的空间比预想中的要多,下面有个大神解决了他的疑问,当然他的解答也适合于我的疑问。
原因就在于,我们使用的编译器的printf的内部实现可能使用了malloc(例如创建缓冲区),而malloc调用了sbrk(),在heap上申请了内存,所以第一次调用printf()之后堆被改变了,但是第一次打印时打印的是堆被printf改变之前的break地址,但此时break地址已经被改变了。
接下来的几次printf()调用可能对该缓冲区进行了复用所以不用再次改变堆,所以打印的一直是上次break被改变之后的地址。
再写一段代码证明这个猜想:
void *fuck = sbrk(0);void *shit = sbrk(0);printf("%p\n", sbrk(0));printf("%p\n", sbrk(0));printf("%p\n", shit);printf("%p\n", fuck);printf("%p\n", sbrk(0));
输出印证了这个猜想是正确的:
0x106c1900x108e0000x106c1900x106c1900x108e000
这件事给我的感触就是有一些细节一定不要放过,认真探索下去说不定会发现点以前没注意到过的新东西
阅读全文
0 0
- printf有趣的\033
- printf有趣的用法
- printf有趣的\033
- 有趣的printf
- 【c】printf中有趣的%n
- c语言:有趣的printf输出,“4321”
- C语言中有趣的printf
- printf有趣笔试题
- 一道很有趣的关于printf的笔试题
- 嵌入式 printf("\033[1;33m Hello World. \033[0m \n");有趣的串口之超级终端的玩法
- printf("\033[1;33m Hello World. \033[0m \n");有趣的串口之超级终端的玩法
- printf("\033[1;33m Hello World. \033[0m \n");有趣的串口之超级终端的玩法
- 有趣的
- 有趣的地方,有趣的东西!
- 有趣的生活,有趣的比赛
- 有趣的有趣的家庭菜园
- [JZOJ4296]有趣的有趣的家庭菜园
- 【有趣的有趣的家庭菜园】题解
- linux
- Java反射应用
- Nodejs安装后修改全局路径配置
- Storm集群组件和编程模型
- 【大牛第一步】安装chrome,利用google学习,开启github之旅
- 有趣的printf
- Storm的编程模型与核心组件
- Java语言实现各种排序算法
- 2. ESP8266固件的编译(nodemcu固件)
- 加农炮
- 工程中函数库建立和调用
- Toolbar
- 视图
- Android下音频的测试程序tinyalsa(录音,放音,查看声卡信息)