C++ 为什么是c++;是否向数组中插入垃圾?

C++ 为什么是c++;是否向数组中插入垃圾?,c++,arrays,C++,Arrays,我编写了一个函数,通过索引将一个元素插入数组,函数如下: bool insertByindex(int数组[],int大小,int索引,int元素){ 如果(索引>大小| |索引=size | |索引size总是4@KamilCuk为什么它第一次工作?我如何解决这个问题?你有未定义的行为,因为访问超出了数组。这解释了任何behv你所观察到的一切,包括“它第一次工作”这句误导性的话。请展示您建议的解决方案功能的头部/原型。我认为按值调用参数存在问题。我已经发布了答案,您可以查看。如果遇到任何错误,

我编写了一个函数,通过索引将一个元素插入数组,函数如下:

bool insertByindex(int数组[],int大小,int索引,int元素){
如果(索引>大小| |索引<0){
这就是罪魁祸首:

for(int i=size; i>index;i--){
            array[i]=array[i-1];
在第一次迭代中,
i
是数组的大小,所以您可以指定数组的末尾

它调用未定义的行为,坏事情开始发生……这里的实现可能将
size
变量放在数组之后,您已经覆盖了它

始终控制两次,以确保阵列上不会发生越界访问


由于数组o size
size
的较高索引是
size-1
只需编写:

for(int i=size-1; i>index;i--){
            array[i]=array[i-1];
...
函数应控制
索引
严格小于
大小

if(index >= size || index < 0){
    cout <<"Invalid position!";
    return false;
}
if(索引>=size | |索引<0){

cout因此您的程序正在显示未定义的行为!!当您试图访问超出分配堆栈范围的内存时(表示程序启动前分配的内存)。
在大多数情况下,编译器会触发断点来读取未定义的内存。但幸运的是,您在尝试读取第二个条目时访问了大小为
的内存块。

因此,
size=7
,因此它读取前面的一个数字。
看起来您需要一个可扩展的内存块。更好的方法是堆分配内存,当需要扩展时,可以将内存块复制到一个更大的新内存块。 此代码应该可以正常工作

int* insertByindex(int *array, int size, int index, int element) {
  int *temp = array;
  array = new int[size + 1];

  for(int i = 0; i < size; i++)
    array[i] = temp[i];

  delete[] temp;

  // end of the modification

  if (index > size || index < 0) {
    cout <<"Invalid position!";
    return nullptr;
  } else {
  // Replaced > with >=
    for (int i = size; i >= index; i--) {
      array[i] = array[i - 1];
    }
    array[index]= element;
    return array;
  }
}

int main() {
  int size = 4;
  int *arr = new int[size];
  arr[0] = 1;
  arr[1] = 2;
  arr[2] = 3;
  arr[3] = 5;

  //end of the modification

  // calling the function
  arr = insertByindex(arr, size++, 3, 4);

  // print the array
  cout << 4 << "--> ";
  for (int i = 0 ; i < size ; i++) {
     cout << arr[i] << " ";
  }
  cout << "\n";

  // calling the function again
  arr = insertByindex(arr, size++, 4, 7);

  // print the array
  cout << size << "--> ";
  for (int i = 0 ; i < size ; i++) {
        cout << arr[i]<< " ";
  }

  getchar();
  return 0;
}
int*insertByindex(int*数组、int大小、int索引、int元素){
int*temp=数组;
数组=新整数[size+1];
对于(int i=0;i大小| |索引<0){
库特=
对于(int i=大小;i>=索引;i--){
数组[i]=数组[i-1];
}
数组[索引]=元素;
返回数组;
}
}
int main(){
int size=4;
int*arr=新的int[size];
arr[0]=1;
arr[1]=2;
arr[2]=3;
arr[3]=5;
//修改结束
//调用函数
arr=insertByindex(arr,size++,3,4);
//打印阵列

cout
int i=size
array[i]
访问
array
超出范围。
arr
有4个元素,
arr[4]
不存在。
insertByindex(arr,size,4
-不能在索引为4的元素处插入(即第5个元素).
arr
有4个元素。我也不明白
size
是如何增加的-我总是在输出中
4-->
size
总是
4
@KamilCuk为什么它第一次工作?我如何解决这个问题?你有未定义的行为,因为访问超出了数组。这解释了任何behv你所观察到的一切,包括“它第一次工作”这句误导性的话。请展示您建议的解决方案功能的头部/原型。我认为按值调用参数存在问题。我已经发布了答案,您可以查看。如果遇到任何错误,请报告。谢谢,但我如何修复它?@Roxana:只需从
大小-1
开始(请参阅我的编辑)我这样做了,结果如下:
4-->12347-->1234754
我想将索引后的所有元素向前移动,为新元素留出空间,就像
5-->123456-->123475
@Roxana:请停止写入数组末尾。对于大小为4的数组,任何对
数组[4]的访问权限都可以
是UB。但有一点你是对的,我没有识别出另一个错误…无论如何,
insertByindex(arr,size,4,7);
是错误的:
arr[4]
超过了数组的末尾。
int* insertByindex(int *array, int size, int index, int element) {
  int *temp = array;
  array = new int[size + 1];

  for(int i = 0; i < size; i++)
    array[i] = temp[i];

  delete[] temp;

  // end of the modification

  if (index > size || index < 0) {
    cout <<"Invalid position!";
    return nullptr;
  } else {
  // Replaced > with >=
    for (int i = size; i >= index; i--) {
      array[i] = array[i - 1];
    }
    array[index]= element;
    return array;
  }
}

int main() {
  int size = 4;
  int *arr = new int[size];
  arr[0] = 1;
  arr[1] = 2;
  arr[2] = 3;
  arr[3] = 5;

  //end of the modification

  // calling the function
  arr = insertByindex(arr, size++, 3, 4);

  // print the array
  cout << 4 << "--> ";
  for (int i = 0 ; i < size ; i++) {
     cout << arr[i] << " ";
  }
  cout << "\n";

  // calling the function again
  arr = insertByindex(arr, size++, 4, 7);

  // print the array
  cout << size << "--> ";
  for (int i = 0 ; i < size ; i++) {
        cout << arr[i]<< " ";
  }

  getchar();
  return 0;
}