假设我们创建了动态分配的内存,例如:
int SIZE = 10;
int *p = new int[SIZE];
for(int i = 0; i < SIZE; ++i)
p[i] = i;
它将把 0 到 9 赋值给我们的指针数组。
然后我想将 10,11,12 添加到数组
我可以做什么:
p[10] = 10;
p[11] = 11;
p[12] = 12;
或者我应该这样做:
delete[] p;
size = 13;
p = new int[SIZE];
for(int i = 0; i < SIZE; ++i)
p[i] = i;
最佳答案
您必须为更大尺寸的数组重新分配内存。否则程序将出现未定义的行为。
例如
int SIZE = 10;
int *p = new int[SIZE];
for(int i = 0; i < SIZE; ++i)
p[i] = i;
int *tmp = new int[SIZE + 3];
std::copy( p, p + SIZE, tmp );
delete []p;
p = tmp;
p[SIZE++] = 10;
p[SIZE++] = 11;
p[SIZE++] = 12;
或者您可以编写代替最后三个语句
for ( const int &value : { 10, 11, 12 } ) p[SIZE++] = value;
当然,在这种情况下,最好使用标准容器 std::vector
。
实际上上面的代码类似于下面的
#include <vector>
//...
std::vector<int> v( 10 );
for ( int i = 0; i < v.size(); i++ ) v[i] = i;
v.reserve( 13 );
for ( const int &value : { 10, 11, 12 } ) v.push_back( value );
除了所有内存管理都是由 vector 内部完成的。
关于C++ 如何通过超出大小向指针数组添加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58916552/