如何将动态内存分配的数组调整为特定值?

Posted

技术标签:

【中文标题】如何将动态内存分配的数组调整为特定值?【英文标题】:How to resize an dynamic memory allocated array to a specific value? 【发布时间】:2011-09-21 06:45:15 【问题描述】:

所以我有一个名为 digits 的数组,它具有动态分配的内存。初始容量设置为默认容量 20。我试图弄清楚如何实现以下代码,以便如果将某些内容添加到超过容量的数组中,代码将创建一个 2^n 的新数组更大(即 40、80、160)。但是我希望它有一个 for 循环,这将使数组 2^n 更大,直到新容量大于输入的容量。

void BigNum::resize(size_t n)

size_t *NEW_CAPACITY;

if(n == capacity)
    return; // The allocated memory is already the right size

if(n < used)
    n = used;

NEW_CAPACITY = new size_t[n];
copy(digits, digits + used, NEW_CAPACITY);
delete[] digits;
    digits = NEW_CAPACITY;
capacity = n;

非常感谢任何帮助

【问题讨论】:

你为什么不用std::vector 您不使用 std::vector 的任何具体原因,它会自动执行类似的操作吗? 因为我必须以这种方式处理它,这是一个要求。我所写的基本上就是我想要做的我只需要一个 for 循环来调整 NEW_CAPACITY 数组,直到它比输入的更大。我需要弄清楚如何在每个循环上使数组大小 2^n 更大 【参考方案1】:

如果您使用 C++ 语法编写 C 代码 - 请使用 C 方法:reallocmalloc

如果您正在编写 C++ 代码 - 使用 std::vector 而不是数组。

您所指的循环是一个简单的计算:

while(current<required) 
    current = 2*current;

new_digits = realloc(digits, current);
// check that the allocation succeeded, handle errors, no need
// to copy data - realloc does that for you.

完成。

【讨论】:

我必须使用数组作为项目的一部分。我想弄清楚的是,如果数组的每个部分对应于较大数字的一个数字并且该较大数字超过默认容量 20,则用于处理大量数字。那么数组的大小应调整为 2^n默认直到新容量大于大数 为什么在循环内调用realloc?此外,您编写它的方式使得无法从 realloc 的失败中恢复(如果 realloc 失败,digits 的旧值将丢失并且您会出现泄漏)。 @Idelic - 虽然我通常会像这样解雇迂腐的 cmets,但在我看来,OP 无能为力,只能复制我的示例,所以我会更正它。 @Sean,如果一个句子需要 3 行,那么很可能没有人会明白你想说什么。【参考方案2】:

“我试图弄清楚如何实现以下代码,以便如果将某些内容添加到超出容量的数组中,代码将创建一个大 2^n 的新数组(即 40, 80, 160)。但是我希望它有一个 for 循环,这将使数组 2^n 更大,直到新容量大于输入的容量。”

首先,我认为您的意思是 2*n 而不是 2^n。

其次,为什么不像其他评论者所说的那样使用 std::vector?

第三,我不完全理解你的问题,但听起来你想要这个:

int newCapacity = capacity;
while( newCapacity < n )
  newCapacity *= 2;

不过,这似乎很琐碎,所以您能澄清一下您的问题吗?

【讨论】:

以上是关于如何将动态内存分配的数组调整为特定值?的主要内容,如果未能解决你的问题,请参考以下文章

如何为多维数组动态分配内存

如何正确地为字符串“数组”动态分配内存

动态内存分配

动态内存分配与指向它的指针变量

OOP 1.3 动态内存分配

指针数组的动态内存分配