【问题标题】:please explain the ouptput of following code请解释以下代码的输出
【发布时间】:2019-06-20 15:39:02
【问题描述】:

我一直试图在给定索引处将新元素插入给定数组。虽然我能够插入新元素,但我几乎没有疑问..

  1. 为什么它被插入到第 7 个索引而不是第 3 个?
  2. 变量k的值怎么变成7?
  3. 为什么新数组有 1 个元素,但新数组和旧数组的大小相同?

提前致谢。任何帮助将不胜感激。

int main()
{

    int arr[] = {1,2,3,4,5,6,7};
    int n = sizeof(arr)/sizeof(arr[0]);
    int k = 3;

    cout << "elements of old array" << endl;
    for (int i=0; i<n; i++){
        cout << arr[i] << endl;
    }
    cout << "size of old array  " << sizeof(arr) << endl << endl << endl;

    // inserting new element

    for (int j=n; j>k; j--){
        arr[j] = arr[j-1];
    }

    arr[k] = 10;

    cout << "elements of new array  " << endl;
    for (int i=0; i<=n; i++){
        cout << arr[i] << endl;
    }
    cout << "size of new array " << sizeof(arr)<< endl ;

   }

【问题讨论】:

  • 1) 您为什么不尝试使用调试器逐行执行代码? 2)arr[j],当j == n 是未定义的行为(由于数组的索引超出范围)。因此,弄清楚为什么观察到某些特定行为是没有意义的。 3) 考虑向good C++ book学习。
  • 如果您打算更改数组大小,请使用 std::vector
  • 无关:如果您的编译器是最新的,您可以使用std::size 而不是sizeof(arr)/sizeof(arr[0]) 来确定数组的大小。

标签: c++ arrays insert


【解决方案1】:

经典的 C 内存问题!

当您将 arr 声明为数组时,它具有固定长度......因此内存中的空间量是固定的。通过将 arr 的所有元素向右移动,您实际上并没有增加 arr 的大小,您只是在写入与 arr 直接相邻的任何内存。

这解释了为什么将 k 设置为 7。k 必须存储在内存中的 arr 末尾附近。因此,当您将 arr[n-1] 转换为 arr[n] 时,k 被设置为 7。

如果你想解决这个问题,我建议创建一个大小为 n + 1 的新数组,然后使用新索引复制所有元素。

【讨论】:

    【解决方案2】:

    数组一旦创建就具有固定的大小;您的数组长度为 7,仅此而已 - 它不会改变。

    您的代码将数组移动了一个元素,这涉及写入arr[7],这意味着“将此值存储在数组arr 的第八个元素中”,编译器很乐意这样做 - 没有边界检查C++ 中的数组。但是,它不会扩展数组的长度,它只是写入内存,如果数组八个元素长的话,第八个元素所在的位置。

    在您的代码中,恰好第八个元素所在的内存实际上是变量k 的存储位置,这就是k 的值变为7 的原因(我怀疑变量@987654325 @ 已被优化掉,否则将是 n 被更改)。

    长话短说,在 C++(和 C)中处理数组充满危险,您必须非常小心。在任何当前和/或生产代码中,您应该改用std::vector

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      • 2017-01-15
      相关资源
      最近更新 更多