#include<iostream>
using std::cout;
using std::endl;
int arr1[5];
int arr2[5] = {1,3,5};
int main()
{
int arr3[5];
int arr4[5] = {2,4,6};
int *pi1 = new int[5];
int *pi2 = new int[5]();
for(int i = 0; i != 5; i++)
cout << arr1[i] << " ";
cout << endl;
for(int i = 0; i != 5; i++)
cout << arr2[i] << " ";
cout << endl;
for(int i = 0; i != 5; i++)
cout << arr3[i] << " ";
cout << endl;
for(int i = 0; i != 5; i++)
cout << arr4[i] << " ";
cout << endl;
for(int i = 0; i != 5; i++)
cout << *(pi1 + i) << " ";
cout << endl;
for(int i = 0; i != 5; i++)
cout << *(pi2 + i) << " ";
cout << endl;
return 0;
}
Windows XP SP3下 Visual Studio 2005 编译执行的结果:
Windows XP SP3下eclipse + CDT + MinGW 编译执行的结果:
Ubuntu Linux 8.04下eclipse + CDT + g++ 编译执行的结果:
由以上的三组结果中前四个数组的初始化结果是同样的,可得到下面结论:
对于元素为内置类型的数组
arr1:静态分配、定义在函数体外、未使用初始化列表显式初始化,元素都初始化为0;
arr2:静态分配、定义在函数体外、初始化列表中未提供初值的元素初始化为0;
arr3:静态分配、定义在函数体内、未使用初始化列表显式初始化,不正确元素进行初始化;
arr4:静态分配、定义在函数体内、初始化列表中未提供初值的元素初始化为0;
三组结果中的后两个数组初始化的结果似乎是依赖于编译器的,而MinGW与g++的结果竟然还不同(MinGW的结果也太诡异了)。当中第一组(MS编译器)初始化数组的结果和C++ Primer(第四版)中讲到的动态分配的数组初始化规则是一致的,即动态分配数组时,假设数组元素是内置类型,则无初始化,如pi1。也可使用跟在数组长度后面的一对空圆括号,对数组元素做值初始化,如pi2。