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

C 最初分配0个元素,以便以后重新分配和测量大小,c,arrays,malloc,realloc,C,Arrays,Malloc,Realloc,我有一个函数,通过每次调用新内存来为数组添加新位置 问题是,对于每个调用,我需要它向数组中添加一个位置,从第一次调用时的1开始,但我知道我必须在重新分配之前进行mallocate 所以我的问题是,我可以先做一些类似于p=malloc(0)的事情,然后在我的函数中使用p=(int*)realloc(p,sizeof(int))进行重新分配吗p声明为int*p 也许用不同的语法 当然,我可以在我的函数中设置一个条件,如果以前没有分配过内存,那么这个条件会被错误定位,如果以前分配过,那么它会被重新分配

我有一个函数,通过每次调用新内存来为数组添加新位置

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

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

也许用不同的语法

当然,我可以在我的函数中设置一个条件,如果以前没有分配过内存,那么这个条件会被错误定位,如果以前分配过,那么它会被重新分配,但我正在寻找一个更好的方法

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

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


有什么建议吗?

您可以将指针初始化为
NULL
,这样第一次调用
realloc(您的指针,您的大小)
,它将返回与
malloc(您的大小)
相同的值

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

struct MyIntVector {
    int * ptr;
    size_t count;
}
然后,您可能希望为malloc、realloc和free(您可以将
ptr
重置为NULL)定义包装函数,它将您的结构作为参数之一,并根据需要更新结构

如果您希望优化此操作,以便一次推送1个元素,则可以添加
allocatedCount
成员,并且只有当
count==allocatedCount
时才添加realloc,新的
allocatedCount
等于(例如)旧的
allocatedCount
的两倍

您应该在
MyIntVector\u Push(MyIntVector*,int)
函数中实现这一点


你会有一个简化的C++版本:代码> > STD::向量(但是当对象超出范围时没有自动解除分配)。

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

如果p被初始化为NULL,第一次就可以正常工作。但是,请确保在调整大小后传递所需的字节数,而不是在编写问题时传递所需的额外空间


至于尺寸,你必须跟踪它。这就是C的设计方式。< /P>请不要链接到C++资源。C和C++是不同的(也许是资源)@ WielpLaSSER指出,我删除了ReSoalSo.谢谢你的完整答案,谢谢你给的选择!我会立即开始研究所有的可能性。@BLUEPIXY任何一个都是OK@BLUEPIXY这是一个非常糟糕的
realloc
示例,1。不要强制执行无效*,2。检查
null
@BLUEPIXY
realloc
是否可与
malloc
先前返回的任何指针一起使用之前,请不要覆盖指针,以确保完整性:C11(草案)7.22.3.5/3()
p = realloc(p, your_new_size)