【问题标题】:Is void *p = 0L valid?void *p = 0L 有效吗?
【发布时间】:2011-05-30 10:48:41
【问题描述】:

this answer 中,sassman 初始化一个指针:

zend_class_entry* ce = 0L;

我的问题是——这有效吗?我会说它不是,用空指针初始化变量或者一个未修饰的(并且可能强制转换为 void *) 0 常量,或者一些计算结果为 NULL 的宏应该被使用。

但是,我在支持这种解释的标准中找不到明确的语言。它只是说:

值为 0 的整数常量表达式,或这种类型的表达式 void *,称为空指针常量

【问题讨论】:

  • NULL 是 0x0 等于 0L...所以我看不出这里有什么问题。
  • @JustSid:在 C 中,NULL 被定义为 (void*)0 或类似的东西。
  • @JustSid:这里的“0x0 等于 0L”到底是什么意思? “平等的”?比较相等?但0x0 也等于0.0,但0.0 不能用作空指针常量。
  • 0L 是一个整数,写成十六进制,它的 0x0 可以用作指针地址。 NULL = 0x0 = 0L。但! 0.0f 是浮点数,因此与 0L 等整数不同。这就是使 0x0 等于 0L 但不等于 0.0f 的原因

标签: c


【解决方案1】:

0L 是一个整数常量表达式,其值为 0。当用作指针时,这样的常量表达式是一个空指针常量。这正是您引用的句子所说的(C99 6.3.2.3/3):

值为0 的整型常量表达式或转换为void * 类型的表达式称为空指针常量。

紧随其后的是可以将空指针常量转换为空指针的语句:

如果将空指针常量转换为指针类型,则生成的指针(称为空指针)保证与指向任何对象或函数的指针不相等。

为什么你认为0 不能用作空指针常量?

【讨论】:

  • 因为常量0L和常量0不完全一样,作为第一个作为long类型,标准只提到0
  • @Artefacto:它仍然是“一个整数常量表达式,其值为0。” 00L 可能有不同的类型,但它们的值相同。
【解决方案2】:

绝对 any 具有零值的整型常量表达式将被编译器视为空指针常量。 0L 是一个完全有效的空指针常量,所以代码绝对有效。

【讨论】:

    【解决方案3】:

    您可以将所有内置 POD 类型设置为文字常量 0 而无需强制转换。

    【讨论】:

    • 你不能将结构和联合设置为0{0} 是 C 中 所有 类型的通用零初始化器,但对于赋值,您仍然需要 C99 复合文字 ((type){0})。
    • 结构和联合不是 POD。所以我原来的说法是正确的。 POD 类型是指可以由单个机器寄存器(int、float、enum 等)表示的任何内容。
    猜你喜欢
    • 2021-10-05
    • 2023-04-11
    • 2014-02-19
    • 1970-01-01
    • 2017-08-06
    • 2021-04-06
    • 2014-05-26
    • 1970-01-01
    • 2018-04-29
    相关资源
    最近更新 更多