【问题标题】:Last Element of Array different values数组的最后一个元素不同的值
【发布时间】:2016-02-09 11:30:00
【问题描述】:

我有一个包含 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 

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

【问题讨论】:

    标签: c arrays file while-loop


    【解决方案1】:
    int len[15];
    

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

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

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

    【讨论】:

    • 你从第一次+1就得到了它
    【解决方案2】:

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

    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 作为数组名称是一个非常令人困惑的选择。

    【讨论】:

    • 问题是我的声明,我打算声明一个 16 元素数组,我不使用 0 元素
    猜你喜欢
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 2021-03-14
    相关资源
    最近更新 更多