我有一些代码会产生意想不到的结果。这是代码:
#include <iostream>
using namespace std;
int **nums;
int size;
void A(int** arr)
{
int **resize;
resize = new int*[size*2];
for(int i = 0; i < size; i++)
resize[i] = new int(*arr[i]);
cout << endl;
arr = resize;
size *= 2;
delete[] resize;
}
int main()
{
size = 10;
nums = new int*[size];
for(int i = 0; i < size; i++)
nums[i] = new int(i);
for(int i = 0; i < size; i++)
cout << *nums[i] << endl;
A(nums);
cout << endl;
for(int i = (size / 2); i < size; i++)
nums[i] = new int(i);
for(int i = 0; i < size; i++)
cout << *nums[i] << endl;
}
函数A(int ** arr)可以正常工作,实际上可以调整数组的大小。但是,在main()的最后一个for循环中,当数组正在打印时,数组的前两个元素不是0和1,就像它应该的那样。以下是我得到的结果:
0
1
2
3
4
5
6
7
8
9
16331248
16331712
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
每次执行程序时,空格后的前两个整数都不同。经过一些调试后,我发现前两个元素打印正确,直到迭代器i = 13,在第二个中为for循环在main()中。然后数组中的前两个元素占用一些大数。我不确定为什么会这样,我现在已经开展了几个小时的工作:(感谢任何帮助。
答案 0 :(得分:3)
首先,您的函数A
不会调整任何大小。它将换行符打印到标准输出,它将全局size
变量乘以2,然后泄漏一些内存。就是这样。
现在,因为它将size
乘以2(从10增加到20),你遇到了一个问题,在这里:
for(int i = (size / 2); i < size; i++)
nums[i] = new int(i);
在这里,您尝试访问nums
指向的数组的元素10到19。但是nums
指向的数组只有10个元素(编号为0到9),所以你的代码有不确定的行为。
答案 1 :(得分:3)
A()
未修改nums
以指向新数组。即使它是,它正在删除新数组,因此nums
最终会指向无效的内存。您需要声明arr
参数作为参考,并删除旧数组而不是新数组:
void A(int** &arr)
{
int **resize;
resize = new int*[size*2];
for(int i = 0; i < size; i++)
resize[i] = new int(*arr[i]);
cout << endl;
delete[] arr;
arr = resize;
size *= 2;
}
对于你的尝试,我认为你有太多的间接性。尝试删除级别:
#include <iostream>
using namespace std;
int *nums;
int size;
void A(int* &arr)
{
int *resize;
resize = new int[size*2];
for(int i = 0; i < size; i++)
resize[i] = arr[i];
cout << endl;
delete[] arr;
arr = resize;
size *= 2;
}
int main()
{
size = 10;
nums = new int[size];
for(int i = 0; i < size; i++)
nums[i] = i;
for(int i = 0; i < size; i++)
cout << nums[i] << endl;
A(nums);
cout << endl;
for(int i = (size / 2); i < size; i++)
nums[i] = i;
for(int i = 0; i < size; i++)
cout << nums[i] << endl;
delete[] nums;
}
由于你使用的是C ++,你应该使用std::vector
而不是原始数组,然后你可以完全消除A()
:
#include <iostream>
#include <vector>
using namespace std;
vector<int> nums;
int main()
{
nums.resize(10);
for(int i = 0; i < nums.size(); i++)
nums[i] = i;
for(int i = 0; i < nums.size(); i++)
cout << nums[i] << endl;
nums.resize(nums.size()*2);
cout << endl << endl;
for(int i = (nums.size() / 2); i < nums.size(); i++)
nums[i] = i;
for(int i = 0; i < nums.size(); i++)
cout << nums[i] << endl;
}