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


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

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

日付順のインデックス


p.25 2行目

誤)

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

正)

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

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.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)[]の記述がありますが、 こちらも同様に間違いです。


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

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