2010-03-15 42 views
0

下面两个代码有什么区别。C++中数组声明的一个问题

int a[] = {0,0}; 
int a[2] = {0,0}; 

看来我可以在两种情况下为[3]赋值。无论如何,我都可以访问[3]。那有什么区别?

+2

您不能访问'[3]'在任何情况下,无论你的编译器可以让你做什么。这已经被问过。 – 2010-03-15 03:34:18

+0

没有勺子^ H^H^H^H^H a [3]。 (嘿,为什么不评论工作?) – paxdiablo 2010-03-15 03:56:52

回答

10

没有区别。在第一种情况下,编译器会为您计数,如果您稍后决定更改元素的数量,这很好。

事实上,您的编译器原谅您分配或使用a[3]并不意味着这样做是正确的。实际上,您甚至无法访问a[2],因为它只有两个元素,由下标0和1索引。

+0

IOW,并不意味着你可以做一些你应该做的事情。 – kiwicptn 2010-03-15 04:48:32

2

a[3]在这两个实例中同样未定义。不要这样做。

0

C++通常不会对数组进行边界检查 - 抱歉;)因此,您甚至可以访问[200] - 您可以访问阵列外部的SOMETHING。

在第一行中,您创建了一个由两个元素构成的数组,在第二行中我认为它是一个由三个元素组成的数组,其值为0,0未定义。

2

如果您愿意,您可以访问[100000000],但并不意味着它将在您的阵列中。

在这两种情况下,您都声明了长度为2的数组。 写入[3]很可能会导致分段错误。

您可以访问的最高元素是一个[ARRAY_SIZE-1],因此它成为[1]。

这两项的代码行做同样的事情......

+0

我怀疑'a [3]'会导致段错误,但它取决于'a'的位置和“多远”出界“a [3]”,以及您的系统有多敏感。 – 2010-03-15 03:37:46

+0

不错,克里斯。我只是假设或恐惧发展到认为写出数组边界是所有邪恶的根源 – Fuzz 2010-03-17 01:36:15