C言語(C99)の variable length array というものを初体験

Sat Apr 20 01:17:12 JST 2013 (modified: Fri Sep 29 21:38:45 JST 2017)
views: 2487, keywords:プログラミング,C言語 この記事は最終更新日が7年以上前のものです。

こちらを拝読してびっくりしたので検証しました。

http://cpplover.blogspot.jp/2013/04/llvmclanglinuxgcc.html

variable length array自体は、GCCは大昔から拡張機能としてサポートしている。C99では正式に採用された。
配列のサイズにconstでない変数をぶち込んでも良いとのこと・・・。しかも大昔から。ほんまかい。

こんなコードを書いて・・・

uedamac:~ ueda$ cat hoge.c
   #include
   
   void kidding_me(size_t size)
   {
       int nums[size];
   
       for(int i=0;i<size;i++){
           nums[i] = i;
           printf("%d\\n",nums[i]);
       }
   }
   
   int main(int argc, char const* argv[])
   {
       kidding_me(4);
       return 0;
   }

こんぴゃーるして実行。-std=c99 というオプションが必要なのか?

uedamac:~ ueda$ gcc ./hoge.c
   ./hoge.c: In function ‘kidding_me’:
   ./hoge.c:7: error: ‘for’ loop initial declaration used outside C99 mode
   uedamac:~ ueda$ gcc -std=c99 ./hoge.c
   uedamac:~ ueda$

あ、サイズが可変なことより、for(int ...の方が怒られているのね。もしかしてオプション要らないんじゃないか?

書き直してコンパイル・・・と。

uedamac:~ ueda$ cat hoge.c
   #include
   
   void kidding_me(size_t size)
   {
       int nums[size];
   
       int i=0;
       for(i=0;i<size;i++){
           nums[i] = i;
           printf("%d\\n",nums[i]);
       }
   }
   
   int main(int argc, char const* argv[])
   {
       kidding_me(4);
       return 0;
   }
   uedamac:~ ueda$ gcc ./hoge.c
   uedamac:~ ueda$ ./a.out
   0
   1
   2
   3

特に技術的にごちゃごちゃ書く元気はありませんが、一言言わせてください。

気持ち悪い!

以上です。これは・・・使わない方がよいと思う・・・。いや、オッサンだからそう思うだけか・・・。ポータビリティーというより、なんかメモリの使い方の前提が分からなくなりそうなので・・・。シェルスクリプトは動けばいいというのが持論なんだけど、Cのコードはちょっと違うのかなと。はたまた自分の頭が固いのか。

これ知ってる人ってどれだけいるんだろ?

ノート   このエントリーをはてなブックマークに追加 
 

prev:学ぶ事と生産について next:variable length array で配列の要素数の限界を調べた(しかしvariable length arrayあまり関係ない)

やり散らかし一覧

記事いろいろ