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

时间:2016-07-27 21:00:04

标签: 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?
}

会发生什么?指针 - 当它超出界限时,让我们说一个16字节的存储器 - 只是从0xF翻转到0x0?是否继续计算并且*ptr = 10;行崩溃了计算机?

我没有尝试过愚蠢,但我很好奇。

6 个答案:

答案 0 :(得分:10)

未定义的行为。

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

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

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

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

答案 1 :(得分:2)

在C ++中访问分配给你的内存之外的内存(newmalloc等)是未定义的行为,所以不要期望任何事情顺利进行。

实际上,在物理限制之外增加指针是由平台定义的,对于大多数平台来说,它最终会翻转;访问它可能会导致崩溃。

对于大多数现代操作系统,尝试在分配进程之外读取或写入内存会导致访问冲突或分段错误。

答案 2 :(得分:1)

指针仅对某个对象有效,或者" 1次传递"。

int x;
int *p = &x;
p++;
p++; // invalid
int y[5];
p = &y[4];
p = &y[5];
p = &y[6]; // invalid

可以为指针指定空指针值;

p = NULL;

指针可以指代功能。

那就是它。指定其他值的指针是未定义的行为(UB),例如:

int* ptr = 0;
ptr += 1;  // UB  (NULL is not a pointer to a valid object, so "1 pass" is UB)

答案 3 :(得分:1)

C / C ++语言不是为现有系统/机器定义的,而是为抽象黑盒子定义的(虽然它不会忽略现实)。您要求未定义的行为(某些现有系统/机器可能会按预期执行)

答案 4 :(得分:0)

在我所知道的常见系统上(主要是/我的系统),指针的行为与unsigned long s非常相似:

int main(){
    char* p = NULL;
    printf("%p\n", p);
    printf("%p\n", --p);
}

输出:

(nil)
0xffffffffffffffff

但我想从理论上讲,各种异国情调都可能发生。

答案 5 :(得分:0)

IMO,你的指针没有任何问题,如果你只是保存指针就没有任何事情发生,但当你试图取消引用/访问它时,我确信你的代码最终会导致访问冲突并导致程序崩溃。 或者如果它是一个有效的指针,它将修改其他数据,可能修改另一个变量内容'