为什么c++插入一个垃圾到数组?
我编写了一个函数来按索引将元素插入数组,这是函数:
bool insertByindex(int array[], int size, int index, int element) {
if (index > size || index < 0) {
cout <<"Invalid position!";
return false;
} else {
for (int i = size; i > index; i--) {
array[i] = array[i - 1];
}
array[index]= element;
return true;
}
}
int main() {
int arr[] = {1, 2, 3, 5};
int size = sizeof(arr) / sizeof(arr[0]);
// calling the function
insertByindex(arr, size, 3, 4);
// print the array
cout << size << "--> ";
for (int i = 0 ; i < size ; i++) {
cout << arr[i] << " ";
}
cout << "n";
// calling the function again
insertByindex(arr, size, 4, 7);
// print the array
cout << size << "--> ";
for (int i = 0 ; i < size ; i++) {
cout << arr[i]<< " ";
}
return 0;
}
第一次工作正常,但第二次时,它会在末尾插入一个垃圾元素并增加数组的大小。为什么会发生这种情况?这是输出(第一个数字是数组的大小,----> 之后的数字是数组的项目):
5--> 1 2 3 4 5
7--> 1 2 3 4 7 5 5
为什么第二次数组的大小是 7(不是 6),最后的 5 是多少?
回答
这是罪魁祸首:
for(int i=size; i>index;i--){
array[i]=array[i-1];
第一次迭代i是数组的大小,所以你分配数组的末尾!
它调用 Undefined Behavior 并且不好的事情开始发生......这里的实现可能将size变量放在数组之后并且你已经覆盖了它。
始终控制两次,以免在数组上发生越界访问...
作为用于阵列O大小较高折射率的size是size - 1只写:
for(int i=size-1; i>index;i--){
array[i]=array[i-1];
...
和函数应该控制index是stricly小于size:
if(index >= size || index < 0){
cout <<"Invalid position!";
return false;
}