Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 包含0个元素的数组_C++_Arrays_Pointers - Fatal编程技术网

C++ 包含0个元素的数组

C++ 包含0个元素的数组,c++,arrays,pointers,C++,Arrays,Pointers,包含0个元素的数组是否与未分配指针相同 Isint-arr[0]与int*arr相同 编辑:如果我做了类似的事情怎么办: int x[0]; int* const arr = x; 我尝试了这段代码并编译了它。据我所知,x和arr都应该指向内存中的同一位置。在这种情况下会有什么不同呢?一点也不 在arr[0]的情况下,arr具有定义良好的地址 在*arr的情况下,arr只是未初始化 编辑后,使用前面定义的数组初始化常量arr:变量的内容没有区别,但允许对其执行的操作不同。零长度数组指向特定地址

包含0个元素的数组是否与未分配指针相同

Is
int-arr[0]
int*arr相同

编辑:如果我做了类似的事情怎么办:

int x[0];
int* const arr = x;
我尝试了这段代码并编译了它。据我所知,x和arr都应该指向内存中的同一位置。在这种情况下会有什么不同呢?

一点也不

在arr[0]的情况下,arr具有定义良好的地址

在*arr的情况下,arr只是未初始化


编辑后,使用前面定义的数组初始化常量arr:变量的内容没有区别,但允许对其执行的操作不同。

零长度数组指向特定地址,即数组的开头。在数组结束后,在本例中,在指向的地址处将有未定义的数据

int arr[0];
int* ptr;

// arr is a reliable value;
// *arr is not;
// ptr is not;

一个有用的方法:

< P>一个本地声明的零长度数组在C++中是非法的,所以它与未分配的指针不一样。

指针总是指向新的,而数组是静态定义的。@ DasARU,你尝试过了吗?那不会编译…@Dasaru:通常你可以。。。但是您必须手动将arr初始化到给定的内存位置,因为它是常量。看看C++中,有一个零长度数组是不合法的,因此数组将没有一个定义良好的地址。你有这个信息的来源吗?它来自C++标准[DCL,SARD]第83.4/1章。“如果常数表达式(5.19)存在,则它应为积分常数表达式,且其值应大于零。”(该标准可从下载。请参阅“n3337”一文)。实际上,它不仅仅是引用,但不能在这里全部引用。据我所知,根据标准,这种用法是否真正合法还没有达成共识,因为超出界限的数组访问只是UB(并且确实会导致软件出现错误,这不仅仅是一个假设)。@KonradRudolph在C90中,毫无疑问:
int-arr[0]
是非法的,包括在一个结构中。很明显,如果数组被声明为
intarr[1],并且您使用和索引2访问,这是未定义的行为。C99(但不是C++),可以将结构的最后一个成员声明为
intarr[]
支持此用法(但是
int-arr[0];
仍然是一个错误)。@James-Ah,就是这样。那么C++呢?我很确定,数组外访问是不合法的,对吗?”KrRADRooLPH一般来说,对于基本类型、指针和C样式数组,C++的意图是与C相同。(有一种异国的建筑,C++允许正式禁止,但C允许,至少在C++ 03中。这被接受为一个缺陷,并且大概已经被固定在C++ 11中,虽然我还没有验证过。)