这是我的代码;
#include <iostream>
using namespace std;
int main()
{
int *D = new int[20000];
D = { 0 };
cout << D[0];
}
在cout
语句中,无论数组的大小如何,都会出现访问冲突错误。
为什么?
答案 0 :(得分:5)
因为
D = {0};
将指针D
设置为值0
,即nullptr
。然后尝试取消引用
cout << D[0];
空指针是UB(未定义的行为)。
如果您想将数组的第一个元素设置为零,则需要执行
D[0] = 0;
答案 1 :(得分:0)
将D设置为零,因此D指向NULL,这是一个无效的内存地址。也许你想写:
*D = { 0 };
答案 2 :(得分:0)
请注意,从C ++ 11开始,braced-init-list可以用作assignment operator的操作数。
对于任何标量类型
E1
的表达式T
,还有以下附加内容 允许内置赋值表达式的形式:E1 = {} (since C++11) E1 = {E2} (since C++11)
如果右操作数是braced-init-list
如果表达式
E1
具有标量类型,
- 表达式
E1 = {}
相当于E1 = T{}
,其中T
是E1
的类型。- 表达式
E1 = {E2}
相当于E1 = T{E2}
,其中T
是E1
的类型。
这意味着D = { 0 };
与D = int* {0};
等效,这意味着将空指针指向D
。那么D
上的任何解除引用都将是未定义的行为。
您无法通过D = {0};
分配整个阵列。如果您的目的是将所有元素的值设置为0
,则可以在初始化时执行此操作。 e.g。
int *D = new int[20000]{0}; // initialize all the elements to 0
int *D = new int[20000]{}; // same as above