Richard Reese : 詳説 C ポインタ

作成日: 2014-11-03
最終更新日:

概要

C 言語のエキスパートとなるために避けては通れないポインタについて、 図とコードを多用して、視覚的かつ直観的な理解を促す。 また、プログラムが動作するためのメモリ構造と管理方法についても理解できるので、 C に限らず他の言語のプログラマにも役立つ内容となっている。

感想

第 3 章 関数ポインタを使った関数呼び出し

関数ポインタは鬼門である。これを理解しておかないと C 言語は先に進めない。

第 4 章 realloc

p.95 から 4.4 では realloc による配列サイズの変更について述べられている。 なお、p.97 の訳注は reallc 関数はで始まっているが、これは誤植で正しくは realloc 関数はである。

第 5 章 リテラルプール

第 5 章はポインタと文字列である。p.119 からの 5.1.2 リテラルプールという概念は初めて知った。同じ文字列定数が複数個所で定義されていたとしても、 リテラルプールに1つだけ配置されます。 とある。これを実験してみた。

  char s[] = "Saluton, satosi!";
  char t[] = "Saluton, satosi!";
  printf("s = %p, t = %p\n");

この結果は、s = 0xbfbfebc3, t = 0xbfbfebb2 であった。あれ、これはリテラルプールが使われていないということではないか。 次のように書き直してみた。

  char *s = "Saluton, satosi!";
  char *t = "Saluton, satosi!";
  printf("s = %p, t = %p\n");

この結果は、 s = 0x80484e9, t = 0x80484e9 であった。こういうことなのか。

第 6 章 構造体とポインタ

第 6 章は Person 構造体と Employee 構造体を作り、データ構造とポインタの関係を示している。 Person 構造体の当初の構成は、年齢のフィールドが unsigned int だったが、節が進むといつのまにか uint になっている。 uint はそのまま使うとエラーになるので、あくまで unsigned int と記述するか、typedef を使うかして unsigned int と同じであることを言わないといけない。

Employee 構造体は、名前を表す 32 文字のフィールドと、年齢を表す unsigned char 型のフィールドだけである。 確かにunsigned char は人間の年齢を表すには十分な大きさであることはわかるが、私には違和感がある。 数で表現すべきところを (unsigned) char 型を使うのは不自然だと思うからだ。しかい、ここを unsigned int にすると構造体のサイズが大きくなるので、 仕方ないのだろうか。

第 7 章 C11

第7章はセキュリティの問題と不適切なポインタの使用について述べられている。 「7.2.9 文字列に関するセキュリティ問題」の項で、規格 C11 では、 バッファオーバーフローが発生するとエラーを返す strcat_s 関数と strcpy_s 関数が追加されたとある。 そして、この関数をサポートしている処理系は Microsoft Visual C++ のみであると書かれている。

FreeBSD の cc (CLANG version 3.3) や gcc (version 4.7.4) で -std=c11 や -std=gnu11 を付けてのコンパイルを試みたが、 #include <string.h> を宣言しても、 型のチェックで警告が出る。下記は gcc でのコンパイル結果だが、CLANG でも同じだ。

sample7-2-9.c: In function 'main':
sample7-2-9.c:8:3: warning: implicit declaration of function 'strcpy_s' [-Wimplicit-function-declaration]

そして、リンカの段階で、 CLANG では undefined reference to `strcpy_s' という表示が、 gcc では `strcpy_s' に対する定義されていない参照です という表示が出る。

ではというので、 https://code.google.com/p/slibc/ に slibc というライブラリがある。これを FreeBSD の環境でコンパイルしてライブラリを作ろうと思ったのだが、 make もできずに挫折した。

ポインタの訳

この本とは直接関係ないが、ポインタのエスペラント訳語について書いておく。

エスぺラントでは、ポインタの訳としては referenco または montrilo が定着している。referenco は参照の意味、 montrilo は 示す (montri) 道具 (-il-) から来ている。 ただ、C++ ではポインタのほか参照という概念が新たに発生しているので、ポインタには montrilo を当て、 referenco は参照のみに使うことにしたい。

書 名詳説 C ポインタ
著 者Richard Reese
訳 者菊池 彰
発行日
発行元オライリー・ジャパン
定 価3708円(税込)
サイズ??版
ISBN
その他南越谷図書館で借りて読む

まりんきょ学問所読んだ本の記録 > Richard Reese:詳説 C ポインタ


MARUYAMA Satosi