【问题标题】:Dynamic Array. Size ignored. C++动态数组。忽略大小。 C++
【发布时间】:2013-12-26 21:29:41
【问题描述】:

我是 C++ 新手。我尝试理解 C++ 中的内存管理以及使用指针。 我有一个关于动态数组的问题。

//This is the part of my code:
int *ptr;
ptr = new int[3];
ptr[0] = 1;
ptr[1] = 2;
ptr[2] = 3;
// Normally I would think I cannot add further elements to the array, but it is possible
ptr[3] = 4;
ptr[4] = 5; 
ptr[5] = ...

所以,我的问题是,当我使用 size = 3 初始化 Array 的大小时,为什么我能够向数组添加更多元素?

一方面,我的数组可以“动态”增长是有道理的。另一方面,由于这条线,它没有任何意义:

ptr = new int[3];

【问题讨论】:

  • 您正在调用未定义的行为。
  • 回答你“为什么”的部分,C/C++ 不限制检查数组。他们相信让您以难以追踪的方式射击自己。享受吧!

标签: c++ arrays pointers dynamic size


【解决方案1】:

您并没有向数组中添加新元素,您只是在覆盖与您的数组相邻的一些随机内存块。

访问数组元素只是访问指向第一个元素的移位指针:

int *ptr;
ptr = new int[3]; // This code allocates 12 bytes, say 0x12340000 - 0x1234000B. ptr = 0x12340000 (note 4 bytes for each integer)
ptr[2] = 5; // This code sets integer at 0x12340000+2*sizeof(int) = 0x12340008
ptr[3] = 6; // This code sets an "integer" at 0x12340000+3*sizeof(int) = 0x1234000C - which is outside your array
ptr[10000000] = 7; // This or something like this will crash your program

你很幸运这不会导致崩溃 - 在其他情况下,它会。

一般建议:如果以后需要更改集合的大小,则不能向数组添加元素 - 使用 vector

【讨论】:

  • s/lucky/unlucky/ - 在这种情况下,崩溃是一件的事情;它让你知道有问题。糟糕的是,如果它没有崩溃,而是让您的程序处于不良状态。
【解决方案2】:

我建议使用vector 而不是数组。

【讨论】:

    【解决方案3】:

    超出数组边界是未定义的行为。这就是为什么。

    在这种情况下,您很幸运能得到输出。但是未定义的行为意味着该程序下次可能会炸毁您的计算机;)

    所以,不要那样做。

    【讨论】:

      猜你喜欢
      • 2014-04-16
      • 1970-01-01
      • 2019-09-20
      • 1970-01-01
      • 2011-05-03
      • 2013-04-15
      • 2011-10-24
      • 2014-02-23
      相关资源
      最近更新 更多