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 sizesize
的较高索引是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);
//打印阵列
coutint 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;
}