无法访问数组

时间:2017-02-01 14:33:36

标签: c++ visual-c++

这是我的代码;

#include <iostream>
using namespace std;
int main()
{
    int *D = new int[20000];
    D = { 0 };
    cout << D[0];    
}

cout语句中,无论数组的大小如何,都会出现访问冲突错误。 为什么?

3 个答案:

答案 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{},其中TE1的类型。
  •   
  • 表达式E1 = {E2}相当于E1 = T{E2},其中TE1的类型。
  •   

这意味着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