相关疑难解决方法(0)

取消引用无效指针,然后获取结果的地址

考虑:

int* ptr = (int*)0xDEADBEEF;
cout << (void*)&*ptr;
Run Code Online (Sandbox Code Playgroud)

*如果它与一个立即使用&并且假设没有超载op&/ 在场,那么它是多么违法op*


(这对解决过去的数组元素有一个特殊的影响&myArray[n],这个表达式明确相当于&*(myArray+n).这个Q&A解决了更广泛的情况,但我不觉得它真的满足了上面的问题.)

c++ pointers

23
推荐指数
2
解决办法
3129
查看次数

在应用间接时,标准是否要求对指针变量进行左值到右值的转换?

TL; DR

给出以下代码:

int* ptr;
*ptr = 0;
Run Code Online (Sandbox Code Playgroud)

在应用间接之前,是否*ptr需要进行左值到右值的转换ptr

该标准涵盖了许多地方的左值到左值的主题,但似乎没有指定足够的信息来确定*运算符是否需要这样的转换.

细节

左值到右值的转换是覆盖在N3485的部分4.1 左值到右值转换段落1和说(重点矿山前进):

可以将非函数非数组类型T的glvalue(3.10)转换为prvalue.53如果T是不完整类型,则需要进行此转换的程序是错误的.如果glvalue引用的对象不是T类型的对象,并且不是从T派生的类型的对象,或者如果该对象未初始化,则需要此转换的程序具有未定义的行为.[...]

那么*ptr = 0; 转换需要吗?

如果我们转到41节,它说:

[...] 如果需要,标准转换序列将应用于表达式 ,以将其转换为所需的目标类型.

那么什么时候需要呢?如果我们看一下5 表达式,第9段中提到了左值到右值的转换,它说:

每当glvalue表达式作为操作符的操作数出现时,该操作符需要该操作数的prvalue,左值到右值(4.1),数组到指针(4.2)或函数到指针(4.3)标准转换是用于将表达式转换为prvalue.[...]

和第11段说:

在某些情况下,表达式仅出现其副作用.这样的表达式称为丢弃值表达式.[...]当且仅当表达式是volatile限定类型的左值并且它是以下之一时,才应用左值到右值转换(4.1). ...]

两段似乎都不适用于此代码示例和5.3.1 一元运算符1段它说:

一元*运算符执行间接:它所应用的表达式应该是指向对象类型的指针,或指向函数类型的指针,结果是指向表达式指向的对象或函数的左值.如果表达式的类型是"指向T的指针",则结果的类型为"T".[注意:通过指向不完整类型(cv void除外)的指向的间接有效.由此获得的左值可以以有限的方式使用(例如,初始化参考); 这个左值不能转换为prvalue,见4.1. - …

c++ pointers indirection language-lawyer lvalue-to-rvalue

19
推荐指数
2
解决办法
775
查看次数

是否在C++中取消引用无效指针但未使用结果的未定义行为?

考虑以下C++代码:

int main() {
    int* ptr; // Deliberately uninitialized
    (void) *ptr;     // Dereference, do not use result
}
Run Code Online (Sandbox Code Playgroud)

此代码是否会导致未定义的行为?我假设答案是肯定的,即使*ptr实际上并没有在任何地方使用它.是否有规范的特定部分可以保证这一点?

(如果这是重复的话我很抱歉,但我似乎无法在网站上找到任何其他具体提出此问题的内容.)

c++ pointers language-lawyer

2
推荐指数
1
解决办法
452
查看次数