Thinkers'Studio
JavaとC言語の自習ツール
空文を見逃さないようにしよう(C言語版)

式にセミコロン ; をつけたものが文です

セミコロンだけで式の無い文が "空文" です

 空文を、「何もしない」処理として書くことができます。
 たとえば次は、for の初期化式や条件式を空文にし、無限ループにした書き方です。
    for( ;; ) {
        /* 実行したい処理     */
        /* 繰り返しの終了判定 */
    }

(では、今回のクイズです)
 次のプログラムを見てください。 names 配列に入れた姓名の "名" を表示したいのですが ・・・。
#include <stdio.h>
void printFirstName( char *name, char splitter )
{
    int i;

    for( i = 0; name[i] != '\0' && name[i] != splitter; i++ );
        putchar( name[i] );
    putchar( '\n' );
}
main()
{
    int i;
    char *names[] = { "Tanukichi_Tanaka"
                    , "Hiroshi_Inuyama"
                    , "Hanako_Ushida" };

    for( i = 0; i < 3; i++ )
        printFirstName( names[i], '_' );
}
 printFirstName( ) は、splitter で区切られた姓名の名前の部分(first name)をプリントする関数です。
 たとえば Tanukichi_Tanaka さんなら Tanukichi と表示します。
 ところが、上のプログラムの実行結果は次のようになります。
_
_
_
 なぜでしょうか?
  (答えは、次回のC言語の Tips で ・・・)

前回のクイズの答え:  説明中の 【 準備 】 の 2. が抜けていたためです。  (前回の問題を見る
 ポインタ変数を宣言しただけで int分の領域を持った有効なアドレスを代入していないので、p が指すデタラメな場所に値を書き込みに行ったことになります。 p が利用可能領域の外を指しているときは、Segmentation fault が起こります。 別の環境でうまくいったのは、p に格納されていたアドレスがたまたま利用可能領域の内側を指していたからです。
 *p = 3; の前に、p に int変数のアドレスを設定しておかなければなりません。
  int    *p;
  int    a;

  p = &a;   /* pが有効な場所を指すようにしてから使う */
  *p = 3;