NULL 为什么不可以赋值

C_ROOKIES 2015-08-30 05:41:01
NULL的定义 就是RAM的0 地址,
这个地址存在为什么不可以被赋值,
搞不明白了。
...全文
513 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2015-09-01
  • 打赏
  • 举报
回复
0 地址并非不能赋值,只是方法不对:
// 这样当然可以:
int p = 0;
*(int *)p = 0x1234ABCD;
// 这样岂不乱套了?
*(int *)0 = 0x1234ABCD;
如果第二种可以赋值,也就意味着上面说的 3 = 5; 这种写法在 C 语言里也应该是有效的。
www_adintr_com 2015-08-31
  • 打赏
  • 举报
回复
如果你在开发驱动就会发现,NULL 是可以写的。
mujiok2003 2015-08-31
  • 打赏
  • 举报
回复
操作系统内存管理中应该有答案。
赵4老师 2015-08-31
  • 打赏
  • 举报
回复
参考Linux源代码中内存管理相关源代码片断。
alwxkxk 2015-08-31
  • 打赏
  • 举报
回复
12楼正解 NULL是常量,不是变量,不能作为左值,只能作为右值~ 很基础的知识,再多看点书~
tm1mc2 2015-08-31
  • 打赏
  • 举报
回复
当NULL作为地址时, 就是RAM的0 地址,这个地址里存的内容可以被赋值,但是这个地址0不可以被赋值。 它的下一个地址是1,1也是常数也不可被赋值。 可以把NULL复制给一个或多个变量(包括指针变量),任何一个常数都可以赋值给变量。但是任何一个常数都不能被赋值。 你可以x=5,,但是不可以5=x。除非5==x
tm1mc2 2015-08-31
  • 打赏
  • 举报
回复
C语言把NULL作为字符串的最后一个字符,以表示字符串到此结束."\0" 这个"\0"就是NULL的值。这个值是常数。常数不可以被赋值。
tm1mc2 2015-08-31
  • 打赏
  • 举报
回复
NULL是一个常数。常数是不可被赋值的。 例如3是一个常数,不可以3=5,连 3=3都是不可以的。
bear234 2015-08-31
  • 打赏
  • 举报
回复
这个问题就好比你在问为什么 int 是整型 而不是dafds表示整型 规定如此 没什么为什么
Zidane_2014 2015-08-31
  • 打赏
  • 举报
回复
没有相应地址的访问权限。 自然也就谈不上赋值了。
宋寒松 2015-08-30
  • 打赏
  • 举报
回复
NULL的根本意义在于实际应用中不可能存在的指针,不同的架构会有不同的值。当NULL为0时,表示0不会被用作其它用途,当NULL为-1时,表示0xffffffff不会被用作其它用途。如果你的实际用途中包含这样的地址,那么说明你的NULL定义是有问题的。
daiyinger 2015-08-30
  • 打赏
  • 举报
回复
地址一般都有访问权限的
建鼎呓语 2015-08-30
  • 打赏
  • 举报
回复
实际上早期的系统比如DOS,是可以赋值的,当时操作系统还通过检查程序运行前后,0地址处的值有没有变化,来看程序有没有运行出错。也就是说,一般而言,往0地址写入值,都是程序运行期错误导致的。 现代系统中,一般把最低的1KB到4KB作为无效写入地址,只要程序访问了,就认为是运行期错误。毕竟系统分配给你的有效地址范围,肯定不包含这一段。
sdghchj 2015-08-30
  • 打赏
  • 举报
回复
程序用的虚拟地址,不是RAM实际的地址。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧