【发布时间】:2012-04-20 15:14:05
【问题描述】:
0元素的数组和未分配的指针一样吗?
int arr[0];和int* arr;一样吗?
编辑:如果我做了类似的事情怎么办:
int x[0];
int* const arr = x;
我尝试了这段代码并编译了它。据我所知, x 和 arr 都应该指向内存中的相同位置。在这种情况下会有什么不同?
【问题讨论】:
-
指针总是可以指向新的东西,而数组是静态定义的。
0元素的数组和未分配的指针一样吗?
int arr[0];和int* arr;一样吗?
编辑:如果我做了类似的事情怎么办:
int x[0];
int* const arr = x;
我尝试了这段代码并编译了它。据我所知, x 和 arr 都应该指向内存中的相同位置。在这种情况下会有什么不同?
【问题讨论】:
一点也不。
对于 arr[0],arr 具有明确定义的地址。
在 *arr 的情况下,arr 只是未初始化。
在您的编辑之后,您使用之前定义的数组来初始化 const arr:变量的内容没有区别,但在您将被允许对其执行的操作。
【讨论】:
本地声明的零长度数组在 C++ 中是非法的,因此它与未分配的指针不同。
【讨论】:
一个长度为零的数组指向一个特定的地址,即数组的开头。在数组结束后,您将有未定义的数据,在这种情况下,在指向的地址处。
int arr[0];
int* ptr;
// arr is a reliable value;
// *arr is not;
// ptr is not;
一种有用的方法:http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Zero-Length.html
【讨论】:
int arr[0] 是非法的,包括在结构中。很明显,如果数组被声明为int arr[1];,并且您使用索引 2 进行访问,则它是未定义的行为。 C99(但不是 C++),您可以将结构的最终成员声明为 int arr[]; 以支持这种用法(但 int arr[0]; 仍然是一个错误)。