我知道执行以下操作可能不是一种好习惯。但是,我很好奇是否可能?
x = 1;
cout << *(&x + 1) << endl; // Prints value at next memory address.
(&x + 1) = 0; // DOESN'T WORK.
// I want to set the value of the next memory address.
我得到的错误说:
错误:左值作为赋值的左操作数
即使我明白这可能并不有用,我还能做些什么来改变这项工作。
答案 0 :(得分:3)
错误是由于您尝试分配到临时地址。
(&x + 1) = 0;
你可能意味着:
*(&x + 1) = 0;
此表达式的结果取决于x
的类型。如果x
的类型为int
,那么这将导致未定义的行为,因为您实际上已分配给尚未分配的内存。
但是,使用下面的类型将为您的示例生成明确定义的行为。
struct Foo {
Foo& operator=(int i) { x[0] = i; return *this; }
int* operator&() { return x.data(); }
std::array<int, 2> x{{0}};
};
int main() {
Foo x;
x = 1;
std::cout << *(&x + 1) << std::endl; // Equivalent to 'x.x[1]' which is '0'.
*(&x + 1) = 0; // Ok.
}
在C ++中,访问以前未分配的内存始终是未定义的行为。这样的操作的结果可以导致几乎任何事情,例如,在释放的存储器中执行随机指令。
答案 1 :(得分:2)
您忘记使用*
运算符。