非常量零整数转换为`void *`仍然是空指针吗?

问题描述 投票:0回答:1

表达式

(void *)0
称为空指针。 但以下怎么样:

int i = 0;
void *s = (void *)i;

s
也是空指针吗? C 语言标准规定:

6.3.2.3 指针

3 值为 0 的整型常量表达式,例如转换为 void * 类型的表达式,或预定义常量 nullptr 称为空指针常量70)。如果将空指针常量或 nullptr_t 类型的值(必然是值 nullptr)转换为指针类型,则生成的指针(称为空指针)保证与任何对象或函数的指针比较不相等。

4 将空指针转换为另一种指针类型会产生空值 该类型的指针。任意两个空指针比较相等。

5 整数可以转换为任何指针类型。除前面指定的情况外,结果是实现定义的,可能未正确对齐,可能不指向引用类型的实体,并且在存储到对象中时可能会产生不确定的表示。71)

照这个

s
不会是空指针吧?

c language-lawyer standards null-pointer nullptr
1个回答
-2
投票

是的,s 是一个空指针。因为 (void*)i 等于 (void *)0,它是一个空指针。你可以这样检查:

gsm@fc:~/tmp$ cat a.c
#include <stdio.h>

int main()
{
    int i = 0;
    void* s = (void*)i;
    printf("s %s null-pointer\n", s==NULL ? "is" : "isn't");
    return 0;
}
gsm@fc:~/tmp$ gcc -std=c89 a.c
a.c: 在函数‘main’中:
a.c:6:15: 警告:将一个整数转换为大小不同的指针 [-Wint-to-pointer-cast]
    6 |     void* s = (void*)i;
      |               ^
gsm@fc:~/tmp$ ./a.out 
s is null-pointer
© www.soinside.com 2019 - 2024. All rights reserved.