39923


C言語入門 (ASCII SOFTWARE SCIENCE Language)に

>
> 基本データ型の初期化については第3章で説明しました。配列も初期化できますが、記憶クラスが外部変数か静的変数の配列に限定されます。自動変数の配列は初期化できません。配列の初期化は、以下のように行います。
[code]

>     static int room[6] = {3, 2, 0, 2, 1, 4};
>  
[/code]

と書かれていました。

この、「自動変数の配列は初期化できません」が良く分かりません。

最初は、「自動変数として配列を宣言した場合は初期化できない」という事なのかと思ったのですが、  
以下のコードで考えてみると、それは違うようです。

[code]

    #include <stdio.h>
    
    void tekitou(void);
    int main(void)
    {
      tekitou();
      tekitou();
      return 0;
    }
    
    void tekitou(void)
    {
      // auto int room[]={3,2,0,2,1,4};
      static int room[]={3,2,0,2,1,4};
      // int room[]={3,2,0,2,1,4};
      for (int i=0;i<sizeof(room)/sizeof(int);i++)
      {
        printf("%d ",room[i]);
      }
      room[0]=100;
      printf("\n%d\n",room[0]);
    }
    
[/code]

配列の宣言がstaticの場合は出力が

[code]

    3 2 0 2 1 4
    100
    100 2 0 2 1 4
    100
    
[/code]

となり、autoか何も付けない場合は

[code]

    3 2 0 2 1 4
    100
    3 2 0 2 1 4
    100
    
[/code]

となり、静的変数の場合とは挙動が異なり、  
ちゃんと自動変数として配列が初期化できているように思えます。

この「自動変数の配列は初期化できません」というのは、どういう意味なのでしょうか？  
(単純に本が古いから、現在は仕様が変わったという事かもしれません)


CC BY-SA 3.0
2017-11-28T17:49:00.283
39922
2017-11-30T07:42:05.390
2017-11-29T05:03:18.087
19110
25791
question
c
「自動変数の配列は初期化できません」の意味が分かりません


はい、その解説は古いもので、現在は仕様が変わっているだけです。

以下は蛇足。プログラム言語 [c](/questions/tagged/c "'c' のタグが付いた質問を表示")
の仕様は歴史的に４つにわけることができます。

  * 最初の C : Dennis Ritchie が作ったもの（オレオレプログラム言語の１つでしかなかった）  
K&R 本の古いものはこれを解説しています。

  * C89 : `ANSI X3.159-1989` 米国国家規格協会で定めた米国内規格  
俗に ANSI-C と呼ばれているものはこれです。 K&R 本の新しいもの (ANSI 対応と書いてあるもの) はこれを解説しています。  
C90 : C89 をほぼそのまま `ISO/IEC 9899:1990` として国際規格にしたもの  
C95 : `ISO/IEC 9899/Amd1:1995` 微小な改正 Amendment
があって追補の形で規格改正されています。多国語対応のための機能追加があったので日本人はもっと知っておくべきなんですけどね。多くのプログラマは C90
と同じものとして扱っています。  
このような事情により ANSI-C/C89/C90/C95 は同じ規格と考えてよいです。

  * C99 : `ISO/IEC 9899:1999` として国際規格が改定されたもの  
市販されているコンパイラの多くはこれに各ベンダが独自の拡張を施したものです。

  * C11 : `ISO/IEC 9899:2011` として国際規格が改定されたもの  
このコメント書いている時点では、パソコン向けコンパイラは対応が進んでいますがマイコン向けコンパイラは対応していないものがほとんどです。

`ISO/IEC 9899` を日本語に翻訳したものが JIS 規格 `JIS X 3010`
として採用されています。オイラは今その「本」（紙ですね）を参照してこのコメントを書いています。

最初の C では自動変数として定義された配列の初期化はできませんでした。お持ちのその本はおそらく K&R 本の古いやつで、「最初の C
」の解説をしているのだと思われます。

C89 では仕様が変更されており、配列の自動変数も初期化できることになっています。 `JIS X 3010-1993` の 6.5.7 初期化 の章の注釈
(74)
にて「参考文献１と異なり、自動記憶域期間をもつ任意のオブジェクトを初期化できる」となっています。今オイラが見ている紙の本では検索が効かないので参考文献１が何かを確認できませんが、おそらくあなたの持っている
K&R 本を指しているはずです。

C99/C11 でもその辺の事情は変わっていませんので「できる」ことになっています。


CC BY-SA 3.0
2017-11-28T21:12:10.970
39923
2017-11-30T07:42:05.390
2017-11-30T07:42:05.390
8589
8589
39922
answer