「C言語 ポインタ完全制覇(第2版)」正誤表


このページは、拙著「ポインタ完全制覇(第2版)」の正誤表のページです。

あまり増えないことを祈ります。

日付順のインデックス


p.20 List1-2 assembly.sの最後の行のコメント

誤)

        jle     .L3             ← 比較結果がi < 100であればL3にジャンプ

正)

        jle     .L3             ← 比較結果がi <= 100であればL3にジャンプ

p.25 2行目

誤)

その後、1998年(後述するANSI Cの正式な規格化のちょっと前)に

正)

その後、1988年(後述するANSI Cの正式な規格化のちょっと前)に

p.50 側注

「*要素数が入っていないのは、Javaでは配列の要素数はnewしたときに決まるからです。」という注がp.50にありますが、この注に対応する*は、p.49の下から8行目の「のように書きます」のところにあります。


p.75 下から11行目

誤)

*pがループの中に何度出現しても、掛け算と足し算はループの終わりの1回だけで済みます。

正)

*pがループの中に何度出現しても、そのような計算は、ループの終わりの1回の足し算だけで済みます。

array[i]のような表記だと「掛け算と足し算」が発生しますが、ループの終わりでp++するだけなら、足し算は発生しても掛け算は不要です。確認したら旧版は「加算はループの終わりの1回だけで済みます。」と書いてありました。改訂版でenbugしてしまったようです。


p.100 1行目

誤)

見たところ、「関数へのポインタ」と「文字列リテラル」が、~

正)

見たところ、「関数」と「文字列リテラル」が、~

表示しているのは関数へのポインタですが、この場所のメモリに配置されているのは、関数です。


p.102 1行目

誤)

「関数へのポインタ」に読み替えらるので、

正)

「関数へのポインタ」に読み替えらるので、

p.114 List2-6 12行目

誤)

 12:         movl    -20(%rbp), %ed  ← aの内容を%edxにセット

正)

 12:         movl    -20(%rbp), %edx ← aの内容を%edxにセット

p.115 Fig2-8

誤)

正)

  1. ローカル変数result」と「退避したベースポインタ」を書く場所が1段間違っていました。
  2. 「ベースポインタ」の右の矢印「→」が抜けていました。
  3. この図からすると「退避したベースポインタ」が4バイトに見えますが、x86のベースポインタは8バイトです。

p.122 Fig2-10

誤)

正)

「&d」ではなくて「%d」です。


p.163 ふたつめの注

誤)

K&Rのdeclでも付けていませんし、

正)

K&Rのdclでも付けていませんし、

p.194 1行目

誤)

アドレス演算子は、左辺値を持たない式をオペランドとして取ることはできません。

正)

アドレス演算子は、基本的には、左辺値を持つ式をオペランドとして取ります※。

さらに、欄外に注を追加)
左辺値を持つ式のほか、関数をオペランドとして取ることがあります。「3-5-5 関数へのポインタにおける混乱」を参照のこと。

p.215 ふたつめのリスト片

誤)

int a[][3] = { /* int a[3][3]の省略形*/
    {1, 2, 3},
    {4, 5},
    {6}
}; 

正)

int a[][3] = { /* int a[3][3]の省略形*/
    {1, 2, 3},
    {4, 5},
    {6},
}; 

p.360にも書いたように、ここのコンマは書いても書かなくてもどちらでもよいことになっていますが、他の場所では付けているので、一応合わせておきます。


p.226 ⑩の英語的表現

誤)

pointer to function(int)) returning void

正)

pointer to function(int) returning void

p.240 Lis4-5 read_slogan.cの25行目

誤)

  slogan[i] = malloc(sizeof(char) * (slogan_len + 1))

正)

  slogan[i] = malloc(sizeof(char) * slogan_len)

文字列長がlenのときlen + 1だけmalloc()するのはCの定石ですが、このケースではslogan_lenは改行文字分を含んでおり、その改行文字を'\0'で置き換えるわけですから、+ 1は不要です。


p.258 Lis4-13 read_line.cの106行目

誤)

  if (line == NULL) {

正)

  if (*line == NULL) {

malloc()の戻り値は*lineに格納しているのですから、NULLチェックも*lineで行わなければなりません。


p.285 Lis5-5 main.cの1行目

誤)

include <stdio.h>

正)

#include <stdio.h>

p.315 ふたつめのコード片

誤)

typedef enum {
    FILL_NONE,    /* 塗りつぶさない */
    FILL_SOLID,   /* べた塗り */
} FillPattern;

正)

typedef enum {
    FILL_NONE,    /* 塗りつぶさない */
    FILL_SOLID    /* べた塗り */
} FillPattern;

列挙型の末尾のカンマは、C99では合法ですがANSI C(C89/C90)では文法違反です。

この部分のコードがANSI Cだとうたっているわけではないですが、C99とも言っていないので、正誤表にあげておきます。


p.304 Fig5-7の2行上

誤)

ポインタの可変長配列

正)

ポインタの動的配列

旧版では、malloc()で任意サイズの配列を確保するその配列を「可変長配列」と呼んでいましたが、改訂版にて、「可変長配列」はC99のVLAの用語とし、malloc()で確保する配列は「動的配列」と呼ぶように変更しました。その修正漏れです。


p.307 下から2行目

誤)

子へのポインタの可変長配列をつなぐ

正)

子へのポインタの動的配列をつなぐ

旧版では、malloc()で任意サイズの配列を確保するその配列を「可変長配列」と呼んでいましたが、改訂版にて、「可変長配列」はC99のVLAの用語とし、malloc()で確保する配列は「動的配列」と呼ぶように変更しました。その修正漏れです。


p.308 Fig.5-10の中

誤)

子へのポインタの可変長配列をつなぐ

正)

子へのポインタの動的配列をつなぐ

旧版では、malloc()で任意サイズの配列を確保するその配列を「可変長配列」と呼んでいましたが、改訂版にて、「可変長配列」はC99のVLAの用語とし、malloc()で確保する配列は「動的配列」と呼ぶように変更しました。その修正漏れです。


p.326 Fig.5-17

誤)

正)

ここは双方向連結リストの末尾なので、次の要素を指すポインタはNULLであり、ここの表記法では×になります。


p.326 リスト5-17 Shape.hの17行目

p.315と同様です。


p.330 コード片

誤)

void (*draw_shape_func_table)(Shape *shape)[] = {

正)

void (*draw_shape_func_table[])(Shape *shape) = {

draw_shape_func_tableの型は「(Shapeへのポインタを引数に取る)関数へのポインタの配列」なので、 当然こうなります。本書のテーマ的に、ここで間違えてはいけないだろうというミスでした。申し訳ありません。

「わからない人は第3章を読み返しましょう」とか書いてあるのが我ながら余計に痛いです。

p.331の5行目にもvoid (*draw_shape_func_table)(Shape *shape)[]の記述がありますが、 こちらも同様に間違いです。


p.334 下から4行目

誤)

座標群(Pointの可変長配列)

正)

座標群(Pointの動的配列)

旧版では、malloc()で任意サイズの配列を確保するその配列を「可変長配列」と呼んでいましたが、改訂版にて、「可変長配列」はC99のVLAの用語とし、malloc()で確保する配列は「動的配列」と呼ぶように変更しました。その修正漏れです。


著者のWebページトップはこちら

ご意見、ご質問、不具合連絡等は掲示板にお願いいたします。