【问题标题】:C++ Why make new int is error?C++ 为什么 make new int 是错误的?
【发布时间】:2017-03-13 07:16:12
【问题描述】:

为什么我的代码错误?

int *x ;
x = new int[5];
x[0] = 3;
x[1] = 4;
x[2] = 5;
x[3] = 1;
x[4] = 2;
x[5] = 11;
x[6] = 90;
int *y ;
y = new int[5];
cout << "if no error, then this command should be run" << endl;

但输出是:

进程在 0.07883 秒后退出,返回值 3221226356

按任意键继续。 . .

【问题讨论】:

  • new int [5] 并分配7 值......问题出在哪里......??? ;)
  • C++ 没有边界检查。越界会导致未定义的行为。故事结束。

标签: c++ arrays pointers


【解决方案1】:

在编写代码之前,先考虑一下逻辑。如果您可以为5ints 分配空间,然后直接继续存储10(或任何超过5 个元素的内容),那么首先分配任何内容有什么意义?

您在这里看到的是内存溢出,它调用了undefined behavior。 不要那样做。

详细说明,在0-based indexing system 上,上述情况的有效索引将是 0 到 4,超出此范围的任何内容都将访问超出限制的内存,这会调用 UB。

【讨论】:

    【解决方案2】:

    你分配 5 个整数,然后尝试存储 7 个。

    你为什么希望它起作用?

    【讨论】:

      【解决方案3】:

      您无法访问长度为 5 的数组的 5 和 6 位置。

      您只能访问 x[0]、x[1]、x[2]、x[3] 和 x[4] 位置。

      因此,如果一个数组有 n 个位置,您最多可以访问位置 n-1,因为第一个位置是 0。

      【讨论】:

        【解决方案4】:

        为什么 make new int 是错误的

        make new int 没有任何问题。问题在于声明时数组的大小。

        让我们看一下您的代码:

        int *x ;
        
        x = new int[5];
        
        x[0] = 3;
        x[1] = 4;
        x[2] = 5;
        x[3] = 1;
        x[4] = 2;
        x[5] = 11;
        x[6] = 90;
        
        • 首先在第一行声明一个指针 int 变量。
        • 然后您在内存中分配准确 5 个连续的空格,x 指向第一个。
        • 然后您将值分配给 5 个内存块,从 0 开始直到 4,这是有效的,因为 0-4 是 5 个内存块是编译器最初在内存中为您分配的。李>
        • 然后,您尝试将 11 存储在 x[5] 中,将 90 存储在 x[6] 中。这就是发生未定义行为的地方。

        当您尝试移出数组中指定的索引时,您的程序正在尝试访问它不应该访问的内存,因为编译器最初只在内存中分配了固定数量的空间。你不知道x[4] 之后的内存空间是多少,如果有的话,因为编译器只为索引0 到4 的数组分配了内存。x[5] 可能是空的,在您的程序将继续运行,或者它可能在您机器的其他进程中使用,并且尝试访问它是不允许的,这会导致您的情况出现分段错误。

        这就是为什么它被称为未定义的行为;当超出最初声明的数组大小的数组索引可能指向为空或不为空的内存空间时。如果它为空,那么程序将继续运行(这是错误的),但如果它非为空,那么你的程序将由于运行时错误而终止:segmentation故障。

        要解决此问题,请将数组大小更改为:

        x = new int [7]; 
        

        这样编译器会找到 7 个连续的内存空间而不是 5 个。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-06-07
          • 2011-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-06
          • 1970-01-01
          相关资源
          最近更新 更多