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

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

问题在于,对于每次调用,我需要在第一次调用时从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) ,它将返回与malloc(yourSize)相同的值。

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

 struct MyIntVector { int * ptr; size_t count; } 

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

如果要优化此操作以一次推送1个元素,则可以添加allocatedCount成员,并且只有count == allocatedCount才会重新count == allocatedCount ,新的allocatedCount等于(例如)旧的allocatedCount两倍。

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

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

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

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

所以

 p = realloc(p, your_new_size) 

如果p初始化为NULL,则第一次工作正常。 但是,在写完问题之后,请确保在resize后传递所需的字节数,而不是所需的额外空间。

至于尺寸,你必须跟踪它。 这就是C的设计方式。