【问题标题】:Dynamic array resizing in c++ [duplicate]在c ++中调整动态数组大小[重复]
【发布时间】:2020-11-28 06:34:40
【问题描述】:

我正在学习数据结构并遇到了动态数组。现在它们应该可以通过创建一个新循环并将其粘贴到新数组中来调整大小。但是当我取的值超过定义的大小时,它不应该抛出错误吗?

代码如下:

int main() {
    
    int *arr= new int[3];

    for (int i = 0; i < 6; i++)
        cin >> arr[i];

    for (int i = 0; i < 10; i++)
        cout << arr[i] <<" ";

    return 0;
}

数组的大小是 3。我取了 6 个元素并显示了 10 个。我很困惑这是怎么发生的。

请帮助我理解。

【问题讨论】:

  • 数组不可调整大小。 std::vector 是。'
  • C++ 中没有任何工具可以阻止您越过数组的末尾。这称为未定义行为,任何事情都可能发生。
  • 代码不能“正常工作”。你超出了缓冲区。
  • 首先,动态数组是不可调整大小的。您只能创建一个新数组并复制现有元素。其次,C++ 不是一种“友好”的语言,它检查所有可能的错误并在你搞砸时给你很好的错误消息。仅仅因为它没有崩溃并不意味着它“有效”。没有人说错误的代码必须“抛出错误”,未定义的行为意味着任何行为都是可能的。
  • 例如,如果你的数组在栈上,你可以覆盖栈上的其他东西,比如函数调用的返回地址。

标签: c++ dynamic


【解决方案1】:

不应该报错吗?

当您在数组边界之外读取或写入时,程序的行为是不确定的。无法保证会引发错误,也无法保证该行为。

现在它们应该可以通过创建一个新循环并将其粘贴到新数组中来调整大小。

在您的示例中,您只创建了一个数组,而不是创建一个更大的新数组。

【讨论】:

    【解决方案2】:

    有趣的是,您正在编写堆栈溢出代码并将其放置在 stackoverflow 上! arr 是数组中第一个 int 的指针。无论您为数组 arr[n] 分配的大小在内存中都是 n int 。但它可以在为数组分配的内存之外。你在覆盖别的东西......

    【讨论】:

    • 您正在编写堆栈溢出代码 不,它们不是。绝对是缓冲区溢出,但是堆栈溢出是指您分配了太多存储空间以使其全部容纳在堆栈中。此外,int *arr= new int[3]; 分配了动态的,而不是自动的(堆栈)存储。
    • 我的错你是对的!
    猜你喜欢
    • 1970-01-01
    • 2012-10-02
    • 2015-05-06
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多