ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

nullptr是否在C中引用了未定义的行为?

2019-07-29 02:08:09  阅读:223  来源: 互联网

标签:c undefined-behavior reference nullptr


参见英文答案 > Assigning a reference by dereferencing a NULL pointer                                    5个
以下代码愚弄nullptr指针和引用:

#include <cstdio>

void printRefAddr(int &ref) {
    printf("printAddr %p\n", &ref);
}

int main() {    
    int *ip = nullptr;
    int &ir = *ip;

    // 1. get address of nullptr reference
    printf("ip=%p &ir=%p\n", ip, &ir);

    // 2. dereference a nullptr pointer and pass it as reference
    printRefAddr(*ip);

    // 3. pass nullptr reference
    printRefAddr(ir);

    return 0;
}

问题:在C标准中,是注释语句1..3有效代码还是未定义的行为?

C的不同版本是相同还是不同(较旧版本当然会使用0字面而不是nullptr关键字)?

奖金问题:是否有已知的编译器/优化选项,这实际上会导致上面的代码做出意外/崩溃的事情?例如,是否有任何编译器的标志,它会在初始化引用的地方为nullptr生成隐式断言,包括从* ptr传递引用参数?

好奇的示例输出,没什么意外:

ip=(nil) &ir=(nil)
printAddr (nil)
printAddr (nil)

解决方法:

// 2. dereference a nullptr pointer and pass it as reference

取消引用空指针是未定义行为,因此无论您将其作为引用还是按值传递,事实是您已取消引用它并因此调用UB,这意味着从所有投注的那一点开始都是关闭的.

你已经在这里调用了UB:

int &ir = *ip; //ip is null, you cannot deref it without invoking UB.

标签:c,undefined-behavior,reference,nullptr
来源: https://codeday.me/bug/20190729/1567901.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有