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=10
和 s[]
设置为 line[10]
(来自 getline
的调用参数的声明)。
当循环完成 运行 trhough ++i
这些是值:i==9
、s[0]==0, ..., s[9]==9
、c=='\n'
(因为 getchar
作为检查条件的一部分执行)。
然后 if
检查为正并且 s[9]
设置为 '\n'
而 i
被提升为 10
.
最后,s[10]
设置为'[=27=]'
,但是s[10]
不存在!
此外,s[]
稍后打印到 012345678
,s[9]
的值被保留给 '\n'
和 '[=27=]'
之间的值。
'[=27=]'
存储在哪里?我知道它在某处,因为后来另一个函数使用它来检查数组的末尾。
因为chcek i<lim-1
,如果lim
是10,i
在for
循环中永远不会变成9
,它可以达到最大值在条件检查失败之前 8
的值。
在i
变为9
后,for
循环条件检查的第一部分失败,控制跳出循环[没有为此执行getchar()
迭代)。
因此,最多读取 s[8]
,并在 s[9]
处存储 [=22=]
。
我很难理解这个函数:
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=10
和 s[]
设置为 line[10]
(来自 getline
的调用参数的声明)。
当循环完成 运行 trhough ++i
这些是值:i==9
、s[0]==0, ..., s[9]==9
、c=='\n'
(因为 getchar
作为检查条件的一部分执行)。
然后 if
检查为正并且 s[9]
设置为 '\n'
而 i
被提升为 10
.
最后,s[10]
设置为'[=27=]'
,但是s[10]
不存在!
此外,s[]
稍后打印到 012345678
,s[9]
的值被保留给 '\n'
和 '[=27=]'
之间的值。
'[=27=]'
存储在哪里?我知道它在某处,因为后来另一个函数使用它来检查数组的末尾。
因为chcek i<lim-1
,如果lim
是10,i
在for
循环中永远不会变成9
,它可以达到最大值在条件检查失败之前 8
的值。
在i
变为9
后,for
循环条件检查的第一部分失败,控制跳出循环[没有为此执行getchar()
迭代)。
因此,最多读取 s[8]
,并在 s[9]
处存储 [=22=]
。