最初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的设计方式。