我正在阅读 K&R 的书,其中一个练习的答案让我感到困扰。
在解决方案手册中,练习 1-22 声明了一个 char 数组:
#define MAXCOL 10
char line[MAXCOL];
所以我的理解是,在 C 数组中,从 0 ... n-1 开始。如果是这种情况,那么上述声明应该为长度为 10 的 char 数组分配内存,该数组从 0 开始并以 9 结束。根据我的理解,更重要的是 line[10] 超出范围?示例程序中的一个函数最终被传递一个等于 10 的整数值 pos,然后进行以下比较:
int findblnk(int pos) {
while(pos > 0 && line[pos] != ' ')
--pos;
if (pos == 0) //no blanks in line ?
return MAXCOL;
else //at least one blank
return pos+1; //position after blank
}
如果 pos 为 10 并且 line[] 的长度仅为 10,那么 line[pos] 不是超出数组的范围吗?
在 C 中以这种方式进行比较是否可以,或者这可能会导致分段错误?我确信解决方案手册是正确的,这真的让我很困惑。如有必要,我也可以发布整个程序。谢谢!
感谢您快速且非常有帮助的回复,我想这绝对是一个错误。它通过以下分支调用:
else if (++pos >= MAXCOL) {
pos = findblnk(pos);
printl(pos);
pos = newpos(pos);
}
如上所述,MAXCOL 定义为 10。所以对于这个分支 findblnk(pos) pos 将至少传递 10。
您认为 K&R 的解决方案手册值得一读还是以有错误的代码示例而闻名?