■■■ 内容的な間違い ■■ 1刷に含まれる間違い(2刷では直っているもの) ■ p.34 下から8行目 % gcc dummy2.c -o ... となっていますが, % gcc dummy2.c -o dummy2-warn -Wall の間違いです. ■ p.70 中段ちょい下に掲載されているプログラムリストで,main() 関数にもかかわらず, return (0); してしまっています.main() でなく test() の間違いです. ■ p.107 下から12行目 「hogehoge.hというライブラリがないので」 → 「hogehoge.hというヘッダファイルがないので」 ■ p.114 中段辺り 「服素数」→「複素数」 ■ p.159 下から3行目 「アドレスのオフセット + サイズ × 番号」 とありますが, 「先頭アドレス + サイズ × 番号」 の間違いです. ■ p.269 下から7行目 「0番地アクセス」とありますが,NULL が0番地になる保証はありません. 「不正番地アクセス」の間違いです.p.274 下から4行目も同様です. ■■ 1刷,2刷に含まれる間違い ■ 67ページ:ひとつ目のリストの3行目 ColorNumber; となっていますが,セミコロンが不要です. ColorNumber に修正してください. ■ 77ページ:上から12行目 「C言語のサブセット」→「C言語のスーパーセット」 ■ 264ページ:上から5行目 「a+=b-cが、a=a+b-cになる」→「a-=b-cが、a=a-b-cになる」 ■ 327ページ:下から4行目 「NOP(No OPerand: 何もしない」→「NOP(No OPeration: 何もしない」 ■ P78,リスト1-39、1-40に関して 1-39ではfunc1関数の引数は無しと定義されていますが、1-40では"test"を 引数にしてfunc1()関数を呼び出してしまっています。 func1("test") でなく,func1() の間違いです.また,リスト1-39の先頭に, #include "sample.h" が必要です. ■ 68ページ:下から6行目 「と定義された関数に対して、」→「と宣言された関数に対して、」 ■■ 1刷,2刷,3刷に含まれる間違い ■ p.56 1行目 ------------------------------------------------------------------------ は,関数名のつづりや引数,戻り値などを間違えていることになります. ヘッダファイルを作成しなかったり,関数のプロトタイプ宣言を行わなかっ たりすると,この手のバグはコンパイル時に検出することはできず,リンク時 に発見されます.しかし,ヘッダファイルを書くことで,ワーニングとして,コ ンパイル時に確実に捉えることができます. ------------------------------------------------------------------------ とありますが,内容が誤っています. 以下のように修正してください. ------------------------------------------------------------------------ は,関数名のつづりを間違えていることになります. ヘッダファイルを作成しなかったり,-Wall オプションを利用しなかっ たりすると,つづり間違いはコンパイル時に検出することはできず,リンク時 に発見されます.また引数や戻り値の間違いは,チェックされずにリンクもできて しまいます.ヘッダファイルを書き,-Wall オプションを利用することで,これらの 問題を,コンパイル時に確実に捉えることができます. ------------------------------------------------------------------------ ■ p.276 リスト4-27 リスト4-27の8〜11行目で,「,」であるべき部分が,「、」になっています. (以下,波線部) 008 printf(stderr、 ~~ 009 "set_person_parameters(): " 010 "name:%s age:%d sex:%d addr:%s tel:%s\n"、 ~~ 011 name、age、sex、addr、tel); /* 複数行に分割する */ ~~ ~~ ~~ ~~ 以下のように,「,」の間違いです. (11行目では,「,」の後には空白1文字が入るようにしてください) 008 printf(stderr, 009 "set_person_parameters(): " 010 "name:%s age:%d sex:%d addr:%s tel:%s\n", 011 name, age, sex, addr, tel); /* 複数行に分割する */ ■ p.374 リスト6-7 関数 delete_arg() で,argv の最後の NULL がコピーされていません. リスト6-7の17〜18行目を以下のように修正してください. (修正前) 017 for (; i < *argc; i++) 018 argv[i] = argv[i + 1]; (修正後) 017 for (; i < *argc; i++) argv[i] = argv[i + 1]; 018 argv[i] = NULL; ■ p.276 下から10行目 set_person_parameters(struct person * personÅA となっています(行末がÅAとなっています)が, set_person_parameters(struct person * person, の間違いです. ■■■ 補足 ■■ 1刷に関して ■ p.147 16行目 「(例えば,同名の関数が複数ある場合には,最初に発見された関数をリンクする 動作のリンカなど)」 とありますが, (例えば,p.204で説明する「ライブラリアーカイブ」を利用すると,最初に 見つかった関数がリンクされるため,まさにそのような動作になります.(p.347参照) ■■ 1刷,2刷に関して ■ 147ページ:下から6行目 「ライブラリの内部にどのような関数や変数があるのかをユーザー側が知る方法は、 基本的にはありません」 とありますが, 「ライブラリの内部にどのような関数や変数があるのかはコンパイラには わかりません」 ということです. ■ 328ページ 4行目 ------------------------------------ #define LOG(args) fprintf args ------------------------------------ とありますが,これにより, ------------------------------------ #ifdef NDEBUG #define LOG(args) /* none */ #else #define LOG(args) fprintf args #endif ------------------------------------ のような書き方ができます. ■ p.218 3行目 ・1行目 「コメントの中にコメントがある」 とあります.これにはコメントの閉じ忘れによって,次のコメントまでの全ての コードが無効になってしまうというバグを予防する効果があります. ■ p.113末尾 ただし、例外として、インライン関数はヘッダファイル上で定義します。 これはインライン関数の性質上、あたりまえのことです. ■ p.297 17行目 「印象を受けてしまう場合があります。」とあります.これはスペースの数を 無視して差分を取ることもできますが,それでは根本的な解決にはならないため, このように表現しています.