nullptr是否在C中引用了未定义的行为?
发布时间:2020-12-16 09:44:22 所属栏目:百科 来源:网络整理
导读:参见英文答案 Assigning a reference by dereferencing a NULL pointer????????????????????????????????????5个 以下代码愚弄nullptr指针和引用: #include cstdiovoid printRefAddr(int ref) { printf("printAddr %pn",ref);}int main() { int *ip = null
参见英文答案 >
Assigning a reference by dereferencing a NULL pointer????????????????????????????????????5个
以下代码愚弄nullptr指针和引用: #include <cstdio> void printRefAddr(int &ref) { printf("printAddr %pn",&ref); } int main() { int *ip = nullptr; int &ir = *ip; // 1. get address of nullptr reference printf("ip=%p &ir=%pn",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) 解决方法
取消引用空指针是未定义行为,因此无论您将其作为引用还是按值传递,事实是您已取消引用它并因此调用UB,这意味着从所有投注的那一点开始都是关闭的. 你已经在这里调用了UB: int &ir = *ip; //ip is null,you cannot deref it without invoking UB. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |