当指针太大时会发生什么?

Tim*_*ein 2 c c++ pointers

在C++或C中,如果将指针设置为如此高的值以使其超出内存范围,会发生什么?这里有一些代码会做这样的事情:

int* ptr = 0;
while (true) {
    ptr += 1; // eventually this will go out of bounds of the memory ... unless there is an overflow.
    *ptr = 10; // just give it a value, why not?
}
Run Code Online (Sandbox Code Playgroud)

怎么了?指针 - 当它超出界限时,假设一个16字节的存储器 - 只是从0xF翻转到0x0?它是否继续计数并且*ptr = 10;线路崩溃了计算机?

我并不愚蠢尝试,但我很好奇.

Kei*_*son 10

未定义的行为.

实际上,递增指针使其指向一个位置,该位置超过了它最初指向的对象末尾的多个元素会导致未定义的行为.(你可以在一个对象的末尾构建一个指针,但不能超过它.)(有问题的对象是一个数组,非数组对象被视为一个带有一个元素的数组.)

这意味着语言标准没有说明会发生什么.它可能"有效",它可能会使程序崩溃,可能会导致程序能够产生任何症状.

在实践中,行为可能因系统而异.递增指针可能会与递增无符号整数完全相同:更新值而不会导致任何明显的问题.如果尝试取消引用指针,结果取决于系统管理内存的方式.

底线:未定义未定义的行为.

  • 绝对允许指针指向对象. (6认同)
  • @EOF虽然更具体地说只是"仅仅"过去(结束)一个对象. (2认同)
  • @EOF:非常正确.我的措辞笨拙到不正确的程度.我修好了. (2认同)