C数组初始化改变了看似无关的其他变量

时间:2017-09-01 05:27:28

标签: c arrays initialization

我希望有人能告诉我为什么在以下简单的C程序中运行for循环之后我的int变量被设置为0。在我看来,循环应该与我在下面的代码中名为“breakPoint”的变量无关?

#include<stdio.h>

#define MAX 100

int main(){
    char line[MAX];  //array to use for something

    int breakPoint = 23;

    printf("breakPoint is %d \n\n", breakPoint); //breakPoint prints out as 23

    /* intialize the array */
    for(int i = MAX; i>0; --i)
        line[i]=0;

    printf("breakPoint is now  %d\n\n", breakPoint); //breakPoint now prints out as 0???

    getch();
    return 0;
}

非常感谢,我很感激。

我怀疑我将数组声明为一个大小(即MAX)然后当我运行for循环时,我尝试设置每个元素并且我的索引关闭。我发现当我在MAX-1而不是MAX处启动for循环索引时,问题就会消失,即变量breakPoint保持不变。

/* intialize the array this way fixes the problem */
for(int i = MAX-1; i>0; --i)
    line[i]=0;

但仍然可以有人向我解释为什么会这样?特别是,为什么搞乱我的角色数组会影响一个完全不同的变量呢?链接是什么?

1 个答案:

答案 0 :(得分:3)

您的数组char[MAX]包含MAX个元素。由于计数从C开始为0,这意味着具有5个元素的数组将具有索引0,1,2,3和4.同样,您的MAX元素数组将从0到{{ 1}}。但是,for循环以MAX - 1开头。由于i = MAX大于MAX,因此您的访问权限超出了数组的范围。

做这样的事情是未定义的行为,这意味着从技术上讲,任何事情都可能发生。该程序可能会崩溃。你可能会破坏程序中的其他内存。你可能会打开一个平行的虫洞,导致邪恶的太空山羊入侵你的袜子抽屉,吃掉你的每一双袜子中的一个,这样你就会想知道为什么你的袜子会不断丢失。几乎任何事情都有。

无论如何,在这种情况下,发生的事情是你覆盖了MAX - 1变量的值。