2010-12-04 122 views
3

我已经声明了长度为N的数组(假设)。现在,我使用一个循环将一些值赋给这个数组的元素(循环变量用作数组的索引)。该代码是如下:数组索引循环变量在C中重置为零,C++

int main() 
{ 
    int arr[4], j; 
    for(j=0; j<10; j++) 
    {  
    printf("%d\n", j); 
    arr[j] = 0; 
    sleep(1); 
    printf("%d\n\n", j); 
    } 
return 0; 
} 

我期望的输出为0 1 2。9.但是实际发生的情况是当j得到复位为0时,分配ARR [N + 2] = 0(ARR [ 6] = 0,在这种情况下)在循环中执行。 这里发生了什么?我错过了什么吗?

回答

8

你的数组有4个元素,你的索引超出范围,所以你只是跺脚在内存。

鉴于此处的代码,我期望arr[4]可以重置阵列,但由于您提到它的长度为NN+2是导致它的原因,因此堆栈中可能会有一些填充。在任何情况下,当你声明数组和j时,它们都放在堆栈上。在你的情况下,j的位置使得当你的索引超出范围时,你正在访问j所在的内存。

+0

你在这里跺脚是什么意思? – nitzs 2010-12-04 19:51:32

+0

现在明白了。谢谢。 – nitzs 2010-12-04 19:55:04

3

该代码的行为未定义,因为它有一个错误。 arr的大小为4,但是您正在用j编制超过此大小的索引。

2

您的数组溢出。你用4个元素来定义它:

int arr[4] 

但是你试图分配10个元素。

j显然位于数组之后,所以当您分配arr[6] = 0时,您正在清除j