嘿,我知道这很简单,但出于某种原因,我的时间比我想象的要艰难。我试图尝试的是,如果我的动态数组的大小等于其中的元素的实际数量(意味着它已满),那么我想将数组的大小加倍并添加元素
int add_element(int *array, int size , int &count)
{
int temp;
cout << "What number do you want to add ? " << endl;
cin >> temp;
if(count = size)
{
copy(array, size);
count++;
array[count] = temp;
}
return count;
}
void copy(int *oldArr , int size)
{
int temp = size * 2;
int *newArr = new int[temp];
for (int i = 0; i < size; i++)
{
newArr[i] = oldArr[i];
}
//delete[] oldArr;
oldArr = NULL;
oldArr = newArr;
delete[] oldArr;
我遇到的问题是实际上并没有使数组的大小加倍,因为当我试图寻找元素时它只返回地址空间。 任何帮助都是值得赞赏的
*********** EDIT ********* 我继续做了这些改变,但我的阵列似乎仍然没有改变大小
void add_element(int* &array, int size , int &count)
{
int temp;
cout << "What number do you want to add ? " << endl;
cin >> temp;
if(count == size)
{
copy(array, size);
count++;
array[count] = temp;
}
}
void copy(int* &oldArr , int size)
{
int temp = size * 2;
int *newArr = new int[temp];
for (int i = 0; i < size; i++)
{
newArr[i] = oldArr[i];
}
delete[] oldArr;
oldArr = newArr;
答案 0 :(得分:1)
您的代码中存在多个错误。
首先,在add_element
中你想测试项目数是否等于数组大小,而是你不小心覆盖count
变量:
if(count = size) // this assigns count
应替换为
if(count == size)
其次,删除新分配的数组而不是旧数组:
oldArr = newArr;
delete[] oldArr; // this will effectively deallocate newArr
你应该改变这些行的顺序:
delete[] oldArr; // it deletes oldArr
oldArr = newArr; // and then points it to newArr
第三,按值将指针传递给数组。这样,当分配新数组时,您将无法将新数组的地址返回给函数的调用者。您应该通过引用传递数组指针,类似于count
:
int add_element(int* &array, int size, int &count)
和
void copy(int* &oldArr, int size)
第四,从函数count
返回add_element
两次:既作为返回值,又作为输入输出参数。虽然,这在技术上不是问题,但绝对没有必要。我建议您将add_element
更改为void
。
<强>更新强>:
最后,但并非至少,我忽略了第五个问题。与需要从函数返回新数组指针的方式类似,也必须对数组大小进行相同的处理。所以size
应该通过引用传递,并且应该正确更新:
int add_element(int* &array, int &size, int &count)
和
void copy(int* &oldArr, int &size) { // pass size by reference
int temp = size * 2;
// ...
oldArr = newArr;
size = temp; // update size
}