最初分配 0 个元素以便稍后重新分配和测量大小

Initially mallocate 0 elements to later reallocate and measure size

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

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

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

也许语法不同?

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

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

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

有什么建议吗?

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

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

struct MyIntVector {
    int * ptr;
    size_t count;
}

那么您可能会想要为 malloc、realloc 和 free 定义包装函数(您可以在其中将 ptr 重置为 NULL),它将您的结构作为参数之一,并将结构更新为需要。

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

的两倍

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

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

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

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

所以

p = realloc(p, your_new_size) 

如果 p 被初始化为 NULL,第一次将正常工作。但是一定要传递调整大小后所需的字节数,而不是你想要的额外 space,因为你已经写了你的问题。

关于尺码,你得自己掌握。这就是 C 语言的设计方式。