K&R 1.9 \\ 超出数组范围?

K&R 1.9 \\ exceeding the scope of an array?

我很难理解这个函数:

int getline(char s[], int lim)
{
    int c,i;

    for (i=0; i<lim-1 && (c=getchar()) != EOF && c!='\n'; ++i)
        s[i] = c;
    if (c == '\n')
    {
        s[i] = c;
        ++i;
    }
    s[i] = '[=10=]';
    return i;
}

我将尝试用输入示例 0123456789\n(总共 11 个字符)来解释我的疑惑。

在此示例中,lim=10s[] 设置为 line[10](来自 getline 的调用参数的声明)。

当循环完成 运行 trhough ++i 这些是值:i==9s[0]==0, ..., s[9]==9c=='\n'(因为 getchar作为检查条件的一部分执行)。

然后 if 检查为正并且 s[9] 设置为 '\n'i 被提升为 10.

最后,s[10]设置为'[=27=]',但是s[10]不存在!

此外,s[] 稍后打印到 012345678s[9] 的值被保留给 '\n''[=27=]' 之间的值。

'[=27=]' 存储在哪里?我知道它在某处,因为后来另一个函数使用它来检查数组的末尾。

因为chcek i<lim-1,如果lim是10,ifor循环中永远不会变成9,它可以达到最大值在条件检查失败之前 8 的值。

i变为9后,for循环条件检查的第一部分失败,控制跳出循环[没有为此执行getchar()迭代)。

因此,最多读取 s[8],并在 s[9] 处存储 [=22=]