【问题标题】:Reallocating 2D arrays on C++在 C++ 上重新分配二维数组
【发布时间】:2012-03-27 19:00:18
【问题描述】:

假设我有:

#include <iostream>
using namespace std;
int **a; //Global Variable
int main()
{
   n=5;
   a = new int*[n];
   for ( int i = 0 ; i < n ; i++ ) 
   a[i] = new int[n] ;
}

是否有任何 realloc() 方法来增加行大小? (列大小是固定的) 我的意思是如果行大小是 5,那么我想让它变成 6 不多,只是 +1。 我用

for(i=0;i<n;i++)
{
   counter++;
   a[i] = (int *) realloc(a[i],counter*sizeof(int));
}

但我觉得有些不对劲......

编辑:请不要建议任何向量或类似的东西。因为我需要我的数组作为全局数组。

【问题讨论】:

  • "因为我需要我的数组作为全局数组。"跟什么有什么关系?
  • 问题在于you are using pointers(Konrad Rudolph 的幻灯片)。 std::vector 对象也可以是全局的。
  • @daknok_t 你建议我不要使用指针,但我的数组的列大小将从键盘输入。所以我必须编码a= new int 的东西。如果您知道任何定义矢量对象大小的方法,请告诉我:)
  • @Who Cares vector::reserve 是您想要的。示例:std::vector&lt;std::vector&lt;int&gt;&gt; a; int main() { ... a.reserve(n); ... }
  • @daknok_t 你能给我更多的信息吗?例如,1) 我如何定义像 a.reserve(m,n) 这样的二维? 2)如何添加新的“行”而不是列,列大小将是从键盘输入的变量,永远不会改变。只需添加一行。

标签: c++ multidimensional-array realloc


【解决方案1】:

realloc 仅在您使用malloc 分配时有效。如果您使用了new,则必须先使用delete,然后再使用new(或者只使用std::vector 之类的东西)。

编辑:既然你问了一个如何使用malloc的例子:

a = new int*[n];

会变成

a = (int **) malloc (n * sizeof (int *));

a[i] = new int[n] ;

会变成

a[i] = (int *) malloc (n * sizeof (int));

【讨论】:

  • 那么如何使用 malloc 定义我的数组?你能给我和二维的例子吗?
  • 我做了a = (int **) malloc(0 * sizeof(int)); 然后在for循环中a[i]=(int *) malloc(0 * sizeof(int));。但它仍然是一样的......它只运行一次 realloc 命令。然后分段错误...
  • 仍然 realloc() 不起作用。其实我很困惑。 a[i] = (int *) realloc(a[i],counter*sizeof(int)); 这是一个for循环0到n
【解决方案2】:

您可以编写自己的例程来调整数组的大小。

如果你想要一个大小为 N 的调整大小的块

  1. 分配(新)新大小 N
  2. 将旧数组/块复制到这个新分配的数组/块中
  3. 释放旧数组(删除)

为了避免一次又一次地调用这个例程,最好预先分配一个大块,块的大小将取决于你的应用程序的需要,并且应该避免多次调整数组的大小。

【讨论】:

    【解决方案3】:

    答案是不!

    C++ 内存管理不包含重新分配/调整已分配内存大小的功能。您必须自己使用 new/copy/delete 语义来实现这样的事情

    【讨论】:

    • 其实vector的reserverealloc在功能上没有区别,虽然在更高的层次上。
    • 那不是真的 - 保留不会像 realloc 那样释放未使用(但已分配)的内存。但是考虑到所有 STL 容器都会动态调整大小这一事实,您是对的。编辑了我的帖子。
    • 这就是我说“更高层次”的原因。 reserve 确保保留大内存块,以便push_back 可以访问它,而无需将内存移动到不同的分配块。所以事实上,push_back(不是reserve)的行为类似于realloc
    猜你喜欢
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 2013-11-30
    • 2021-10-11
    • 1970-01-01
    相关资源
    最近更新 更多