设置随机存储器地址的值

时间:2015-09-30 17:30:51

标签: c++ pointers

我知道执行以下操作可能不是一种好习惯。但是,我很好奇是否可能?

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.

我得到的错误说:

  

错误:左值作为赋值的左操作数

即使我明白这可能并不有用,我还能做些什么来改变这项工作。

2 个答案:

答案 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)

您忘记使用*运算符。