C++ 数组值为负1

C++ 数组值为负1,c++,arrays,overflow,C++,Arrays,Overflow,是否存在在存储在-1的数组中具有值的重新讨论?它会以一种不好的方式影响程序或计算机吗?我真的很好奇,我是编程新手,任何我能得到的澄清都会很有帮助,谢谢。没有办法在索引-1的数组对象中存储任何东西。仅仅试图获取指向该不存在元素的指针就会导致未定义的行为 当基指针不是数组对象本身,而是指向另一个数组对象中间的独立指针时,负索引(如-1)可能会出现在类似数组的上下文中,如 int a[10]; int *p = &a[5]; p[-1] = 42; // OK, sets `a[4]` p[

是否存在在存储在-1的数组中具有值的重新讨论?它会以一种不好的方式影响程序或计算机吗?我真的很好奇,我是编程新手,任何我能得到的澄清都会很有帮助,谢谢。

没有办法在索引
-1
的数组对象中存储任何东西。仅仅试图获取指向该不存在元素的指针就会导致未定义的行为

当基指针不是数组对象本身,而是指向另一个数组对象中间的独立指针时,负索引(如
-1
)可能会出现在类似数组的上下文中,如

int a[10];
int *p = &a[5];

p[-1] = 42; // OK, sets `a[4]`
p[-2] = 5; // OK, sets `a[3]`
但是,在实际数组开始之前访问不存在的元素的任何尝试都会导致未定义的行为

a[-1]; // undefined behavior
p[-6]; // undefined behavior

您可以看到,若您试图通过在括号中指向某个值来获取数组的元素,基本上您是在指定内存地址的偏移量(乘以分配类型的大小)。如果您以类似
int*a=new int[N]
的典型方式分配数组,则允许使用的内存将从地址
a
限制到
a+
(在本例中为
sizeof(int)*N
),因此,通过尝试使用索引
-1
获取值,您将超出数组的界限,这肯定会导致错误或可能的程序崩溃


当然,您的内存指针可能不是某个已分配序列开头的指针,比如(考虑上一个示例)
int*b=a+1
,在这种情况下,您可以(至少编译器允许)获取
a[-1]
的值,它将是有效的,但是,由于很难管理这样的代码的正确性,我仍然建议不要这样做。

如果超出范围,这是未定义的行为,所以是的,可能会发生很多不好的情况。理论上,这可能会导致程序员死亡。@JosephMansfield这将是一个糟糕的实现。