VC++(VS2012) で以下のプログラムを、コマンドラインでコンパイルして実行。
#include <stdio.h> void func() { int a[10]; int i; printf("-----------"); for (i=0; i<10; i++) { printf("%08xn",a[i]); // 初期化前の値を表示 a[i] = 0x1234; // 初期化? } } int main() { func(); // 一回目 func(); // 二回目 }
コンパイルのコマンドはこう。
cl ConsoleApplication1.c
結果はこんな。自動変数は初期化されていないのがわかる。
C>test ----------- 011937fb 00e0f708 01199118 00e0f784 011924a0 35abafe8 fffffffe 0119538c 01195457 011937fb ----------- 00001234 00001234 00001234 00001234 00001234 00001234 00001234 00001234 00001234 00001234
次に、VS2012 の IDE 上で、「Win32 コンソールアプリケーション」で作成、コンパイルしてみる。ソースコードは以下。
#include "stdafx.h" void func() { printf("-----------n"); int a[10]; for (int i=0; i<10; i++) { printf("%08xn",a[i]); // 初期化前の値を表示 a[i] = 0x1234; // 初期化? } } int _tmain(int argc, _TCHAR* argv[]) { func(); // 一回目 func(); // 二回目 return 0; }
結果はこんな。
----------- cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc ----------- cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc
0xcc で初期化されている。(*1)
おまけに C# でもやってみる。
using System; namespace ConsoleApplication1 { class Program { static void func() { Console.WriteLine("-----------"); int[] a = new int[10]; for (int i = 0; i < 10; i++) { Console.WriteLine("{0}", a[i]); a[i] = 0x1234; } } static void Main(string[] args) { func(); // 一回目 func(); // 二回目 } } }
結果はこう。
----------- 0 0 0 0 0 0 0 0 0 0 ----------- 0 0 0 0 0 0 0 0 0 0
C# はつまらん…(何
(*1)
これは、デバックモードで実行した結果です。
デバックモードでは、コンパイルオプション /RTCs 相当が指定されていることに起因します。
http://msdn.microsoft.com/ja-jp/library/8wtf2dfz.aspx
したがって、このオプションを外せば、C++ の場合でも上記 C言語と同様に自動変数は初期化されません。