系统刚上电时,1M的内存地址空间里面是不是都是0啊?

发布于 2022-09-28 22:27:55 字数 77 浏览 20 评论 0

我是想说,C语言里空指针NULL实际就是0.  系统可以保证不指向任何地址。这是不是说内存低地址的第一个字节总是被OS保留,不做它用?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

静水深流 2022-10-05 22:27:55

.

1、你还是没有搞清楚指针的用途。指针是用来指向数据的,指针本身也就必然是一个量。有指针常量,也有指针变量,但这些都不影响指针指向的数据。指针指向的数据是什么,谁也无法说清道明。

2、另外,也没有权威的标准给 C 语言硬性规定 NULL 就是数字 0。

标准规定了NULL指针,它作为一个特殊的指针变量,表示不指向任何东西,要使一个指针变量为 NULL,可以给它赋一个零值,为了测试一个指针变量是否为NULL,可以将它与零值比较.之所以选择零值是因为一个源代码约定,就机器内部而言,指针的实际值可能与此不同.在这种情况下,编译器负责零值和内部值之间的翻译转换.
                                               --上面这段话选自<<c和指针>;>;p96

.

冰雪梦之恋 2022-10-05 22:27:55

enev more confused. oh my god.
楼上,你能给出free()的源码吗?

如:free(p)
是简单地p=NULL还是把p所指向的内存区域全部释放?
这种释放是库函数实现的,还是依赖OS?如何释放?

尛丟丟 2022-10-05 22:27:55

.

free() 同时依赖于函数库和操作系统的实现。当然,标准规定了 free() 必须遵从的某些行为,这些规定使得(在某个规范下)free() 的行为是基本一致的。(但并不规定它们的具体实现——给实现者发挥的余地)

如果你用 malloc() 分配了内存,就请用 free() 去释放它。malloc() 和 free() 是一对共生的函数。

实现的具体内容,有时并不是你需要关心的。因为既然把很大的操作余地留给了实现者,那么每个实现都将有很大的区别。malloc() 有不少版本,当然 free() 也同样。主要的几种版本出现在常见的 C 语言函数库实现中,比如 GNU libc,BSD libc,Linux libc,专有系统的 libc,等等。在某些 libc 实现里甚至出现同时提供多个 malloc() 版本的情况。

但是,所有的 C free() 都不应将指针设为 NULL,因为你给 free() 的参数是指针,而不是指针的地址,所以只能得到指针的值,而无法修改这个指针。在 ANSI C 以及后续的 C 标准中,规定了 free() 函数的某些语义,在此我就不便细说这些内容了。

.

固执像三岁 2022-10-05 22:27:55

7.20.3.2 The free function
  Synopsis
1         #include <stdlib.h>
          void free(void *ptr);
  Description
2 The free function causes the space pointed to by ptr to be deallocated, that is, made
  available for further allocation. If ptr is a null pointer, no action occurs. Otherwise, if
  the argument does not match a pointer earlier returned by the calloc, malloc, or
  realloc function, or if the space has been deallocated by a call to free or realloc,
  the behavior is undefined.
  Returns
3 The free function returns no value.

若水般的淡然安静女子 2022-10-05 22:27:55

>> 系统刚上电时,1M的内存地址空间里面是不是都是0啊?

怎么会呢? 全是0机器怎么运行?

当 hardware rest 时,也就是刚上电时。处理器内部的 cs 和 ip(指令指针)的初始状态是:
ip = 0xFFF0
cs 的其中两上组成部分为: cs 选择子  = 0xF000
                                       cs 基地址 = 0xFFFF0000

rest后处理器处于实模式状态,可寻址范围 1M。cs 的基地址被加载为 cs 选择子 *16,也就是 0xF0000,cs:ip 的值就是: 0xFFFF0,处于 0xFFFF0 位置是 EPROM(BIOS) 中的初始化代码。

这样的小城市 2022-10-05 22:27:55

原帖由 hcq0411 于 2007-3-17 09:29 发表于 1楼  
我是想说,C语言里空指针NULL实际就是0.  系统可以保证不指向任何地址。这是不是说内存低地址的第一个字节总是被OS保留,不做它用?

0 这个地址没错就是受 OS  保留或都说受保护的,所以,读取 0 这个地址内容,会引发 13 号异常 General-Protection(#GP),内存访问保护异常。在 unix/linux 系统上会见到 coredump

江湖正好 2022-10-05 22:27:55

原帖由 hcq0411 于 2007-3-17 09:29 发表于 1楼  
我是想说,C语言里空指针NULL实际就是0.  系统可以保证不指向任何地址。这是不是说内存低地址的第一个字节总是被OS保留,不做它用?

楼主的帖名和内容是两码事。只好分别回答。
帖名:
一般来说,这1MB空间内,有一部分是RAM,另部分是ROM。对于前者区域,是全0。后者区域是在ROM里固化的内容。启动模块就安排在ROM区。
内容:
C标准并没规定空指针的值是0。很多C编译器将其规定为0,是因为方便。因为,地址0是系统区,用户进程是绝对不会访问这块的。当进程运行时,如果检查出来指针为0,就认定它未指向任何实体。因此,这个0,仅仅是一个标识,并非实际的0。

毁虫ゝ 2022-10-05 22:27:55

thank u all so much!!!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文