K & R の本を読んでいるのですが、演習の 1 つに対する答えが気になります。
ソリューション マニュアルでは、演習 1-22 で char 配列を宣言しています。
#define MAXCOL 10
char line[MAXCOL];
私の理解では、C配列では0から... n-1になります。その場合、上記の宣言は、0 で始まり 9 で終わる長さ 10 の char 配列にメモリを割り当てる必要があります。サンプル プログラムの関数には、最終的に 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 のソリューション マニュアルは読む価値があると思いますか、それともバグのあるコード例があることで知られていますか?