一个长度为0的数组和未分配的指针一样吗?
int arr[0];
和int* arr;
是一样的吗?
编辑:如果我做了类似下面的事情会怎么样:
int x[0];
int* const arr = x;
我尝试了这段代码并成功编译。据我所知,x和arr应该指向内存中的同一位置。在这种情况下会有什么区别呢?
完全不是这样。
对于arr [0]的情况,arr具有明确定义的地址。
在* arr的情况下,arr只是未初始化的。
在您进行编辑后,在其中使用刚刚定义的数组初始化const arr的情况下:变量的内容没有任何区别,但您可以执行的操作有所不同。
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];
仍然是错误的)。 - James Kanze