2009-10-16 134 views
2
const size_t size = 5; 
int *i = new int[size](); 

for (int* k = i; k != i + size; ++k)            

{                    
cout << *k << endl;           

}   

尽管我已经值通过使用()操作者初始化动态数组元素,输出I得到的是C++初始化动态数组元素

135368 
0 
0 
0 
0 

不知道为什么在第一个数组元素被初始化到135368.

有什么想法?

+3

我认为这是一个编译器错误。有些编译器似乎在初始化时遇到了一些问题:http://www.boost.org/doc/libs/1_40_0/libs/utility/value_init.htm – 2009-10-16 18:01:09

+0

使用'new []'对数组进行值初始化甚至是格式良好?我在标准中找不到任何东西(建议参见§5.3.4)。 – 2009-10-16 18:06:14

+1

'new-type-id'不能是语法上的函数类型。这样,'T [N]()'不是一个函数数组,而是一个数组值初始化的(所以'5.3.4/15'适用)。 – 2009-10-16 18:09:21

回答

6

我的第一个想法是:“ ...只是说!”

你有没有真正的,真正的,令人难以置信的好理由不使用向量?

std::vector<int> i(5, 0); 

编辑:当然,如果你想让它初始化为零,即会在默认情况下发生......

EDIT2:如前所述,你要问的是值初始化 - 但在C++ 2003中添加了值初始化,并且对于某些编译器(特别是较老的编译器)可能无法正常工作。

+0

我不想在向量和数组之间做出选择。我正在玩数组并查看它们的行为。我正在学习C++课程的学习过程: – captonssj 2009-10-16 18:05:39

3

我同意litb的评论。这似乎是一个编译器错误。

把你的代码在一个main功能,并与前缀:

#include <iostream> 
#include <ostream> 
using std::cout; 
using std::endl; 
using std::size_t; 

我有五个零既GCC 4.1.2,并在Linux变种一个gcc 4.4.0。

编辑:

只是因为它是与阵列型稍微异常:在新的表达式的()的初始化意味着该动态分配的对象(一个或多个)是值初始化。即使使用数组new[...]表达式,这也完全合法。除了一对空括号作为数组new表达式的初始值设定项外,其他任何内容都是无效的,但对于非数组new表达式而言,非空初始化程序通用。

+0

和MinGW GCC 3.4.5我得到了5个垃圾数。 – 2009-10-17 03:58:27