请解释以下代码的输出

时间:2019-06-20 15:39:02

标签: c++ arrays insert

我一直试图在给定索引处将新元素插入给定数组。尽管我可以插入新元素,但我对此几乎没有疑问。

  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 ;

   }

2 个答案:

答案 0 :(得分:2)

经典C内存问题!

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

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

如果要解决此问题,建议创建一个大小为n + 1的新数组,然后将所有元素及其新索引复制过来。

答案 1 :(得分:1)

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

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

在您的代码中,确实发生了第八个元素所在的内存实际上是存储变量k的地方,这就是k的值更改为7的原因(我怀疑变量n已经过优化,否则n会被更改)。

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