先谢谢。任何帮助将不胜感激。
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 ;
}
答案 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
。