在下面的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
,就会中断循环。