空指针及其分配给void数据类型

3
问题在于使用 void 数据类型并给 void 变量赋值。
#include<stdio.h>
#include<stdlib.h>
int main()
{
 void *pVoid;
 pVoid = (void*)0;
 printf("%lu",sizeof(pVoid));
 return 0;
}

第二行中pVoid被分配了什么?

3
它被赋予了NULL指针值。另外:与sizeof一起使用的格式说明符是%zu - Weather Vane
1
第二行中pVoid被分配为什么?它是NULL。顺便提一下,在标准C库中,NULL被定义为(void*)0 - Achal
https://softwareengineering.stackexchange.com/a/128447/30872 - GSerg
2个回答

2

直接从 标准库维基 复制:

Original Answer 翻译成 "最初的回答"。

Defined in stddef.h, locale.h, stdio.h, stdlib.h, string.h, time.h.

In standard C, this can be implemented as:

#if !defined(NULL)
    #define NULL ((void*)0)
#endif

因此,pVoid在第二行分配的内容与NULL分配的内容完全相同。

编辑:正如@Jens Gustedt在评论中提到的那样,值得注意的是,这种实现方式的NULL并不是唯一的,并且可能会因平台而异。


这只是“NULL”的一种可能实现,不幸的是。 - Jens Gustedt
你能开发吗?在我所有的.c文件顶部包含stdlib.h已经成为一种条件反射,我不知道其他定义,我想学点新东西。 - m.raynal
1
是的,这就是你应该使用的。C标准中的定义只是一个空指针常量。其他常用的值包括00L。仅仅因为你的平台使用某个特定的值,并不意味着其他平台也必须使用相同的值。 - Jens Gustedt

1

pVoid被赋值为NULL。这是因为表达式(void*)0被定义为空指针常量

C标准的6.3.2.3p3节规定:

一个整数常量表达式,其值为0,或者将这样的表达式强制转换为类型void *,称为空指针常量。如果将空指针常量转换为指针类型,则得到的指针,称为空指针,保证与任何对象或函数的指针比较不相等。


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