変数のメモリ上の配置順

anarchy golfのFizzBuzzを縮めようと思って試行錯誤してたら、何となく気になることに出くわしたのでメモ。
手元の環境では変数がメモリ上に配置される順番は
初期化関係無しでローカル変数、初期化済みのグローバル変数、未初期化か0で初期化されたグローバル変数
な順番で配置されているらしい。ゴルフしてる範囲ではそのようなので

a='zziF';
b='zzuB';
c;
d='egoh';
e='oyip';
f='aguf';

main()
{
  printf("%s\n",&a);    //putsでも同様
}

こんなコードを書くと\0に遭遇するまで出力をするみたいなので(Mingwのlibcを見たわけではないので不確実、後で確認しよう)
上のコードの場合の出力はFizzBuzzhogepiyofugaで、変数bの位置から出力するとBuzzhogepiyofugaになる。
と言っても運良く\0に遭遇しない限り読み続けるようだから、たまにごみが付いたりも。
ちなみに文字定数が表示したい文字列をひっくり返したようになっているのは、手元の環境がリトルエンディアンだから。
繋げたい文字がすぐ隣に配置されてないと駄目だし、int型だから4文字しか入らない。
そもそもint型の変数でやることじゃないし、安全性は皆無だから何かに使えないかと思ったけど何の役に立つのかさっぱりだー
ゴルフに使えないかと思ったけど逆にコード量が増えたという。ぎゃふん。


ただ

a[];
b[]={1};

main(i)
{
  hogehoge...
}

なんてコードを書いたらそれなりに大きい配列aとbを確保できるんじゃないかなーと。
これまた安全性は皆無で使い道不明という素敵なコードだけどね!
でもちょっと面白かったからよしとしよう。役に立つ日がくればめっけもんである。