我有一个包含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,我也可能遗漏了一些东西。
答案 0 :(得分:3)
int len[15];
这声明了一个包含15个元素的数组。它们的索引编号为0
到14
。
访问数组越界是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作为数组名称是一个非常令人困惑的选择。