免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: ethantsien

堆里面所有的内存是不是都是0? [复制链接]

论坛徽章:
0
发表于 2011-11-15 08:41 |显示全部楼层
未使用过的内存,位不都是0,要不calloc就没存在的必要

论坛徽章:
24
摩羯座
日期:2013-12-23 17:28:382015亚冠之塔什干棉农
日期:2015-05-15 14:16:492015亚冠之柏斯波利斯
日期:2015-06-20 11:53:562015亚冠之水原三星
日期:2015-06-30 09:29:23牛市纪念徽章
日期:2015-07-13 11:35:582022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:57青铜圣斗士
日期:2015-11-27 17:45:3815-16赛季CBA联赛之天津
日期:2016-02-15 13:44:3615-16赛季CBA联赛之江苏
日期:2018-05-02 16:56:2715-16赛季CBA联赛之辽宁
日期:2018-08-08 13:41:1015-16赛季CBA联赛之深圳
日期:2018-10-02 18:05:032015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2011-11-15 08:48 |显示全部楼层
整天搞这些没用的东西,这个和语言有一毛钱关系,有意义吗

论坛徽章:
1
白羊座
日期:2013-09-18 22:02:26
发表于 2011-11-15 09:42 |显示全部楼层
ethantsien 发表于 2011-11-14 14:31
  1.         if (*(foo + i) == '\0') {
  2.             printf("%d\n", i);/* 发现后面的内存的位全是0 */
  3.         }
复制代码
你判斷是0才輸出,當然他只能輸出0了!

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
发表于 2011-11-15 14:36 |显示全部楼层
回复 10# btdm123


    为了安全 内核不会给用户包含敏感信息的页的

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2011-11-15 14:56 |显示全部楼层
我突然觉得某人推荐在free之前先bzero()一番的必要性了

论坛徽章:
0
发表于 2011-11-15 15:28 |显示全部楼层
回复 14# amarant


    理解了,谢谢

论坛徽章:
0
发表于 2011-11-15 15:34 |显示全部楼层
改成1000之后的结果:
a
1
2
3
4
5
6
7
9
11
15
19
20
21
22
23
25
27
31
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
60
61
62
63
64
65
66
67
68
69
70
71
76
77
78
79
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
107
111
113
115
117
119
123
127
142
161
210
239
275
295
308
355
385
408
422
646
712
739
808
826
850
880
892
946
964
984
999

明显不全为0。
顺便这段代码被360误报。。。

论坛徽章:
0
发表于 2011-11-20 21:34 |显示全部楼层
[quote]回复  ethantsien
你这个程序未使用,不代表别的程序以前没使用这块内存。

论坛徽章:
0
发表于 2011-11-20 22:34 |显示全部楼层
本帖最后由 digdeep126 于 2011-11-20 22:40 编辑

感觉这个例子还有继续研究的价值。为了方便研究,将原来的代码稍微修改一下:
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main()
  4. {
  5.         char    *foo;
  6.         int     i;

  7.         foo = malloc(sizeof(char));
  8.         *foo = 'a';
  9.         printf("foo: %s\n", foo);
  10.         printf("addr of foo: %p\n", foo);

  11.         for(i = 1; i < 100000; i++){
  12.                 if(*(foo + i) != 0){
  13.                         printf("%d\t", i);
  14.                         printf("%d\n", *(foo + i));
  15.                 }
  16.         }
  17.         printf("===============\n");
  18.         //for(i = -1; i > -9; i--)
  19.         for(i = -1; i > -10; i--)
  20.                 printf("%d\n", *(foo + i ));
  21.         free(foo);

  22.         return 0;
  23. }

复制代码
运行结果:
digdeep@ubuntu:~/uulp$ gcc -Wall -o memory memory.c
digdeep@ubuntu:~/uulp$ ./memory
foo: a
addr of foo: 0x938e008
12        -15
13        15
14        2
===============
0
0
0
17
0
0
0
0
Segmentation fault
digdeep@ubuntu:~/uulp$ ./memory
foo: a
addr of foo: 0x8284008
12        -15
13        15
14        2
===============
0
0
0
17
0
0
0
0
Segmentation fault
digdeep@ubuntu:~/uulp$

这里有几个疑问:
1)为什么每次运行时foo变量的地址不同,但是两个 for 循环输出的内容总是相同的?
2)第二个 for 循环当将 "i > -10;" 改为"i > -9;" 时,不会出现Segmentation fault,难道中间的8个字节是内存分配系统的“薄记信息”,而从第9个字节开始,就是访问另外一个程序申请的堆内存---所以报Segmentation fault?
期待大牛解释!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP