在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;
行崩溃了计算机?
我没有尝试过愚蠢,但我很好奇。
答案 0 :(得分:10)
未定义的行为。
实际上,递增指针使其指向一个位置,该位置超过了它最初指向的对象末尾的多个元素,从而导致未定义的行为。 (你可以在一个对象的末尾构建一个指针,但不能超过它。)(所讨论的对象是一个数组,非数组对象被视为带有一个元素的数组。)
这意味着语言标准没有说明会发生什么。它可能“有效”,可能会导致程序崩溃,可能会导致程序产生任何症状。
在实践中,行为可能因系统而异。递增指针可能会与递增无符号整数完全相同:更新值而不会导致任何明显的问题。如果尝试取消引用指针,结果取决于系统管理内存的方式。
底线:未定义未定义的行为。
答案 1 :(得分:2)
在C ++中访问分配给你的内存之外的内存(new
或malloc
等)是未定义的行为,所以不要期望任何事情顺利进行。
实际上,在物理限制之外增加指针是由平台定义的,对于大多数平台来说,它最终会翻转;访问它可能会导致崩溃。
对于大多数现代操作系统,尝试在分配进程之外读取或写入内存会导致访问冲突或分段错误。
答案 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,你的指针没有任何问题,如果你只是保存指针就没有任何事情发生,但当你试图取消引用/访问它时,我确信你的代码最终会导致访问冲突并导致程序崩溃。 或者如果它是一个有效的指针,它将修改其他数据,可能修改另一个变量内容'