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言語と同様に自動変数は初期化されません。