为什么在while循环内的数组上即使使用了递减运算符也会出现越界错误



在下面的C++代码中,我在最后一行得到了一个越界错误

int n;cin>>n;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
while(n--)
{a[n]-a[n-1];}

应该没有问题,因为在while循环中,n将首先递减,然后开始执行循环中的代码。

我在多个IDE上运行过它,它运行得很好,但当我试图在代码部队上提交解决方案时,出现了一个越界错误。

n--在递减之前返回n

因此,上一次迭代具有n == 0,这意味着a[n - 1]访问元素-1,这是由于越界数组访问而导致的未定义行为的明显情况。

改为--n将给出调整后的变量;"修复";代码。

顺便说一句,可变长度数组不是标准的C++特性,尽管许多C++编译器接受它作为从C99导入的扩展。

问题出在n--上。是的,它递减n,但它的计算值为递减前的n。也就是说,当n--计算为0以中断循环时,循环已经在n等于0的情况下运行。这导致a[n-1]越界。

不过,一个非常简单的更改将使其工作:使用--n。这将在递减后计算为n的值,因此一旦n变为0,就会中断循环。

最新更新