我正在尝试创建一个数组,每次它被完全填满时它就会翻倍。
#include <iostream>
using namespace std;
int* array_doubler(int* array, int size){
int *new_array = new int[size*2];
for(int i = 0; i < size; i++){
new_array[i] = array[i];
}
delete[] array;
return new_array;
}
int main()
{
int N = 10; // Size of array to be created
int *array = new int[0];
for(int i = 0; i < N; i++)
{
if(array[i] == '\0')
array = array_doubler(array, i);
array[i] = i*2;
}
//Printing array elemensts
for(int i = 0; i < N; i++)
cout << array[i] << '\t';
cout << '\n';
return 0;
}
问题是,当我用new创建动态内存时,所有的点都有空字符\0
值(不仅仅是最后一个点)。 即如果我写:
int* p = new int[5];
那么内存中的所有5个块P[0],P[1],P[2],P[3],P[4],P[5]
中都有\0
,而不仅仅是P[5]
。 因此,我的main()
中的if(array[i]=='\0')
为for
循环的每一次迭代调用array_doubler
。 我希望它首先填充数组中的可用点,当它到达最后一个元素时,然后调用array_doubler
。
问题是,当我用new创建动态内存时,所有的点都有空字符\0值(不仅仅是最后一个点)。
实际上,它们中有未定义的值。 0是它们应该具有的有效值,但是明天编译器可能会突然决定它们都应该具有1而不是0。
如果你想检测一个数组的末尾,那么你就得记住这个数组有多大。 C++并不适合你。 实际上,如果您使用std::vector
,它确实可以为您实现这一功能,但我认为这不是本练习的重点。
我不知道您为什么要这样做,因为std::vector提供了这种特性,而且更符合C++的习惯(请参阅isocpp常见问题解答“为什么C样式数组是邪恶的”)。
C样式数组的一个问题是,它们不知道自己的大小,并且它们没有默认值,因此保持未初始化。
如果出于某种原因不需要使用std::vector,那么下一个最佳解决方案是将数组与它的大小包装在一个结构或类中(这是std::vector正在做的事情),或者使用std::memset初始化数组(如果在C语言中,它是您将使用的C函数)。
请记住,这并不被认为是好的实践,当您需要容器时,STL提供了大量的解决方案。