ポインタを使う前に,必ず実体をポインタにセットしよう!

Ver 0.1 8/20/98

目次

  1. 代入の仕組み.
  2. 何でセグメンテーションフォルトになるの?
  3. 配列の初期化のおさらい.
  4. 項目2
  5. 項目3

  1. 代入の仕組み.
  2. 未完成

  3. 何でセグメンテーションフォルトになるの?
  4. 未完成

  5. 配列の初期化のおさらい.
  6. まず用語の定義をしよう.配列の要素に格納するオブジェクトを初期設定子と呼ぶ. 例えば,"int array[3] = { 1, 2, 3 }" と宣言した場合,初期設定子は,{ 1, 2, 3 }である.

    配列の初期化では,次のような規則がある.

    1. 初期設定子の数は,指定した配列要素の数より少なくてもよい.
      "int array[5] = { 1, 2, 3 }"は,
      "int array[5] = { 1, 2, 3, 0, 0 }"と自動的に初期設定子が補充される.
    2. 初期設定子の数が,指定した配列の数より多い場合はエラーとなる.
      "int array[3] = { 1, 2, 3, 4, 5}"はエラー.
    3. 配列の要素数は,自動的に設定される.
      "int array[] = { 1, 2, 3, 4, 5 }"と宣言すれば,コンパイラーが自動的に,
      "int array[5] = { 1, 2, 3, 4, 5 }と同様の処理をしてくれる.
    4. 多次元配列の場合,要素数の省略は一番上位の次元のみ許される.
      次のように初期化すると,最上位の要素数はコンパイラによって自動的に割り当てられる.
      2次元配列の初期化(一部の要素数の指定を省略するケース)
        #include
        
        void main( void )
        {
            /* 要素数の指定の一部省略 */
            static char array[][6] = { "abcdef", "ghi", "jklm" };
            int i;                                                                      
                                                                                        
            for( i=0 ; i<3 ; i++ )                                                      
                printf( "array[%d][]: \"%s\"\n", i, array[i] );                           
        }                                                                               
        

      もちろん以下のように要素数を全て自分で指定してもよい.

      2次元配列の初期化(手動で全て初期化するケース)
        #include
        
        void main( void )
        {
            /* 要素数を自分で指定 */
            char array[3][6] = { "abcdef", "ghi", "jklm" };
            int i;
        
            for( i=0 ; i<3 ; i++ )
                printf( "array[%d][]: \"%s\"\n", i, array[i] );
        }
        

      しかし,次のケースの様に,要素数を全く指定しないか,または,最上位以外の要素 数を指定しない場合は,エラーになりコンパイルできない. その理由は,多次元配列の実メモリでの実現方法にある.

      2次元配列の初期化(間違いのケース)
        #include
        
        void main( void )
        {
            /* 要素数の指定が不十分 */
            char array1[][]  = { "abcdef", "ghi", "jklm" };
            char array2[3][] = { "abcdef", "ghi", "jklm" };
      
            int i;                                                                      
                                                                                        
            for( i=0 ; i<3 ; i++ )                                                      
                printf( "array1[%d][]: \"%s\"\n", i, array[i] );                           
            for( i=0 ; i<3 ; i++ )                                                      
                printf( "array2[%d][]: \"%s\"\n", i, array[i] );
        }                                                                               
        

    未完成

  7. 2次元配列とポインタの配列の違い.
  8. コードタイトル
    
      コード
    
      

    未完成


Written in 1998

[ [ ホームへ | ハッキングのトップへ | C/C++言語のトップへ | C/C++の動作の仕組みのトップへ ]