为什么数组的最后一个元素会改变?

时间:2015-05-26 20:04:17

标签: c

我有以下代码:

void generate_random_array(int8_t array[], int array_size){
    srand(time(NULL));

    for(int i = 0; i < array_size + 1; i++){

        array[i] = rand() % 21 + (-10);
        printf("%d, %d\n", array[i], i); 
    }
}


int main(){

    int8_t some_array[100];

    generate_random_array(some_array, 100);

    for(int i = 0; i < 101; i++){
        printf("%d %d\n", some_array[i], i); 
    }

    return 0;
}

程序生成给定数组的随机元素,范围从-10到10,然后显示它们。问题是当我第二次打印元素时,数组的最后一个元素变为100。我想知道原因。

2 个答案:

答案 0 :(得分:3)

数组的索引从零开始。

int array[3];//  an int array with 3 elements
array[0];    //first element
array[1];    //second element
array[2];    //third element
array[3];    //undefined because it is beyond the end of the array

答案 1 :(得分:1)

在您的函数generate_random_array中,您正在迭代iarray_size + 1。并且您声明了一个大小为100的数组; int8_t some_array[100];操作系统将为您保留100*sizeof(int8_t)字节内存。

你的数组的索引将位于[0,100]范围内,即。排除100th位置。

现在,您正在做的是修改声明中未声明的some_array[100]。它是可能的,因为C不会进行任何越界访问检查。

但需要注意的一点是,您正在尝试修改/读取无人认领的内存。所以这是不确定的行为。有时您可能会获得100以外的其他值。

但是简而言之,这种行为尚未确定,因为您正在访问数组的越界索引。