Array的最后一个元素有不同的值

时间:2015-11-08 20:24:25

标签: c arrays file while-loop

我有一个包含15个元素的数组,并且在每个while循环传递时,最后一个值被更改,或者至少它显然是错误的。有时它会递增,有时它只是跳转到程序控制下的另一个内存地址值。首先,我将所有值归零。代码:

int w16 = 0;
int len[15];
for (i = 0; i < 16; ++i){     //zero the array
    len[i] = 0;
}
while ((c = fgetc(file)) != EOF) {
    printf("while: %d \n", len[15]);
    if(isspace(c)){
        word = 0;
        if (0 < letters && letters < 16){
            len[letters] = len[letters] + 1;
            letters = 0;
        } else if(letters > 15){
            ++w16;
            letters = 0;
        }
    }else if (word == 0) {
        word = 1;
        ++letters;
        ++nw;
    } else if (word == 1) {
        ++letters;
    }
}

printf命令的一些输出。我无法在上面的代码中看到它的变化,为什么只有最后一个,所有其他的都很好:

while: 111 
while: 110 
while: 101 
while: 32 
while: 49 
while: 50 
while: 51 
while: 52 
while: 53 
while: 54 
while: 55 
while: 56 
while: 57 
while: 115 

Before fclose: -1 

关于这里可能有什么问题的任何想法?除了这个讨厌的bug之外,其他一切都很好。我最近从Java转移到C,我也可能遗漏了一些东西。

2 个答案:

答案 0 :(得分:3)

int len[15];

这声明了一个包含15个元素的数组。它们的索引编号为014

访问数组越界是Undefined Behavior。确保您永远不会访问len[15]或更高版本。或者,如果您需要16个元素,请将其设为int len[16]

另一种方法是,如果你需要访问elem 1-15,你可以声明一个包含16个元素的数组,然后忽略第一个元素(索引0)。虽然如果您不习惯零索引数组,这可能是最简单的方法,但我不推荐它,因为几乎所有编程语言都使用零索引数组,迟早您将不得不围绕这一点。见Why are zero-based arrays the norm?

答案 1 :(得分:0)

您正在访问尚未分配的值,即超出索引0-14或长度= 15的数组参数。因此,您将获得一个&#39;垃圾&#39;从未分配的内存中随机(或从第一个可用空间)获取的值 在这里:

for (i = 0; i < 16; ++i){

for (i = 0; i < 15; ++i){

在这里:

if (0 < letters && letters < 16){

if (0 < letters && letters < 15){

虽然我不是100%清楚,如果字母是长度或索引。

我假设索引正在使用len[letters]在这种情况下,您需要考虑字母== 0。

另外,我建议使用名称len作为数组名称是一个非常令人困惑的选择。