(char*) 0 是什么意思?

8

这个问题与以下问题有关: What does (char *)0 mean in c?

那里的答案略微偏离了解释答案具体含义的方向,但最终的答案提到它是指向地址为0的字符指针,并且它是空的。这让我产生了两个疑问。

  1. 在c语言中,我们能给char* 9并说它是一个指向地址9的指针吗?我们会得到任何错误或警告吗?

  2. 好吧,假设(char*)0确实是一个指向地址0的字符指针,但是这个地址0是什么意思呢?我的意思是,我们怎么知道它是空的?如果这样的话,(char*)1或(char*)2等的值会是什么?

编辑: 只是为了放在这里,无论是否有帮助。当我发现linux系统调用execl的最后一个参数为空时,我找到了这个问题,并且我看到了一个相当奇怪的语法:(char *) 0。

谢谢。


2
你可以定义 char *p = (char *)9;(没有警告),但是你不能对其进行解引用,参见 http://c-faq.com/null/。 - David Ranieri
3
重要的是要知道,空指针实际上不一定是指向地址0的指针,空指针实际上是系统相关的。然而,当整数零被转换为指针(任何指针)时,编译器会将其转换为系统相关的空指针。 - Some programmer dude
1个回答

22
在C语言中,(char *) 0不是“指向地址为0的字符指针”。它被特殊处理为产生char *类型的空指针值,形式上它并没有指向任何char对象。它的实际数值(即“地址”)是由具体实现定义的,可以对应于任何地址,不一定是0。例如,数值上,(char *) 0可以产生一个指向地址0xFFFFFFFF的指针,如果给定平台将该地址作为空指针值,但从语言角度来看,空指针值并不真正指向任何地方。 (char *) 9没有这样特殊的含义。(char *) 9所产生的指针也依赖于具体实现。在大多数实现中,它确实会产生一个指向地址9char *指针。
为了绕过(char *) 0的特殊处理,您可以尝试类似以下代码:
int i = 0;
(char *) i;
上述的(char *) i(尽管也依赖于实现)通常会产生一个指向地址0char *指针。这里禁用特殊处理的关键在于表达式中的0不再是常量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接