C++如何通过超出大小将元素添加到指针数组中

C++ how to add an element to a pointer array by exceeding size

本文关键字:添加 指针 数组 元素 小将 何通过 C++      更新时间:2023-10-16

假设我们创建了动态分配的内存,例如:

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 );

除了所有的内存管理都是由向量内部完成的。

第二个选项是正确的方法。第一个选项不会总是抱怨,但您正在写入尚未为数组留出的内存;它被留作其他用途,你不知道是什么。有时它会表现得很好,有时它不会。分配给超出其范围的数组是未定义的行为,我们应该避免它

在您的第一个示例建议中:

p[10] = 10;
p[11] = 11;
p[12] = 12;

您将覆盖您不拥有的内存,这可能导致崩溃。您需要重新分配原始阵列。

const int oldSize = SIZE;
SIZE = 13;
int *newP = new int[SIZE];
memcpy(newP, p, oldSize * sizeof(int));
for (int i = oldSize; i < SIZE; ++i)
{
newP[i] = i;
}
delete[] p;
p = newP;

第二个例子会起作用,但效率稍低,因为每次重新分配都要重新计算值。在我上面的例子中,您只需要重新计算新的值。

或者,您应该查看专门为此目的设计的std::vector(动态调整数组大小(。

std::vector<int> p;
for (int i = 0; i < 10; ++i)
{
p.push_back(i);
}

这里std::vector在内部管理分配,所以您不必担心newdelete