【问题标题】:Initially mallocate 0 elements to later reallocate and measure size最初分配 0 个元素以稍后重新分配和测量大小
【发布时间】:2015-08-21 17:14:48
【问题描述】:

我有一个函数,它会通过每次调用时重新分配新内存来为数组添加一个新位置。

问题是,对于每个调用,我需要它向数组添加一个位置,从第一次调用的 1 开始,但我知道在重新分配之前我必须进行 mallocate。

所以我的问题是,我可以先做类似p = malloc(0) 的事情,然后在我的函数中使用p = (int *)realloc(p,sizeof(int)) 重新分配吗? p 被声明为int *p

也许有不同的语法?

当然,我可以在我的函数中创建一个条件,如果之前没有分配过内存,则将 mallocate,如果有,则重新分配,但我正在寻找更好的方法。

我遇到的第二个问题是......一旦重新分配了更多位置,我想知道数组的大小。

我知道,例如,如果我声明一个数组 a[10],则元素的数量将由 sizeof(a)/sizeof(a[0]) 定义,但由于某种原因,这不适用于声明为指针然后重新分配的数组。

有什么建议吗?

【问题讨论】:

  • @BLUEPIXY 任何一个都可以
  • @BLUEPIXY 没有赌注,它们都有效
  • 这是一个非常糟糕的realloc 示例,1. 不要投射void *,2. 在检查null 之前不要覆盖指针。
  • @BLUEPIXY realloc 可以与 malloc 先前返回的任何指针一起使用

标签: c arrays malloc realloc


【解决方案1】:

您可以初始化指向NULL 的指针,这样当您第一次调用realloc(yourPointer, yourSize) 时,它将返回与malloc(yourSize) 相同的值。

对于第二个问题,您可以使用包含指针和 count 成员的结构。

struct MyIntVector {
    int * ptr;
    size_t count;
}

然后您可能想要为 malloc、realloc 和 free 定义包装函数(您可以将 ptr 重置为 NULL),它将您的结构作为参数之一,并根据需要更新结构。

如果你想优化它以一次推送 1 个元素,你可以添加一个 allocatedCount 成员,并且只有在 count == allocatedCount 时才重新分配,新的 allocatedCount 等于(例如)旧 @987654330 的两倍@。

您应该在 MyIntVector_Push(MyIntVector *, int ) 函数中实现它。

然后您将拥有 c++ std::vector<int> 的简化 c 版本(但在对象超出范围时不会自动释放)。

【讨论】:

  • 请不要链接到 C++ 资源。 C 和 C++ 是不同的(也许是资源)
  • @wildplasser 指出,我删除了资源。
  • 感谢您的完整回答,也感谢您提供的替代方案!我将立即开始研究所有可能性。
【解决方案2】:

正如 ThreeStarProgrammer57 所说,只需使用 realloc。

realloc(NULL, nr_of_bytes) is equivalent to malloc(nr_of_bytes)

所以

p = realloc(p, your_new_size) 
如果 p 初始化为 NULL,

第一次就可以正常工作。但请确保在调整大小后传递您需要的字节数,而不是您编写问题时所需的额外空间。

至于大小,您必须跟踪它。这就是 C 的设计方式。

【讨论】:

猜你喜欢
  • 2011-08-13
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 2013-04-08
  • 1970-01-01
  • 2013-10-31
相关资源
最近更新 更多