c/c++语言开发共享C中的&* NULL定义良好吗?

C标准的哪个版本(如果有的话)是如下明确定义的?

void foo(void) { char *nullPtr = NULL; &*nullPtr; } 

请注意,我没有将结果分配给任何东西 – 第二行是一个简单的语句。

应该是一个有明显答案的问题,但是(在这些问题上似乎经常发生的事情)我听到的同样多的人说答案“显然是未定义的”,因为“明确定义”。

在一个相当相关的说明,以下是什么? 应该foo产生c的读数?

 extern volatile char c; void bar(void) { volatile char *nonnullptr = &c; &*nonnullptr; } 

(相同问题的C ++版本: 在C ++中是否定义了&* NULL? )

    虽然尝试取消引用空指针会导致未定义的行为,但*nullPtr是非法的, &*nullPtr是完全明确定义的。 根据C11标准草案中的脚注102 :

    因此, &* E等效于E (即使E是空指针),….

    这是因为对于一元&算子这一事实( §6.5.3.2¶3 ):

    如果操作数是一元*运算符的结果,那么运算符和运算符都不会被计算,结果就好像两个都被省略了,….

    C99标准具有相同的语言,但这并未出现在C90标准中,而我对该标准的解读是&*nullPtr确实会在C99之前的实现中导致未定义的行为。

    根据C90标准(§6.3.2.3):

    一元 (address-of)运算符的结果是指向由其操作数指定的对象或函数的指针….

    和:

    一元*运算符表示间接….如果为指针分配了无效值,则unary *运算符的行为是未定义的。

    奇怪的是,我没有看到在C99基本原理中对这种变化的任何讨论,尽管我可能只是找不到它。

    需要了解更多c/c++开发分享C中的&* NULL定义良好吗?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享C中的&* NULL定义良好吗?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/979963.html

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月13日

      精彩推荐