我有一个函数,它将通过每次调用重新分配新的内存来为数组添加一个新位置。
问题是,对于每次调用,我需要它向数组添加一个位置,从第一次调用时的1开始,但我理解我必须在重新分配之前错定位。
所以我的问题是,我最初可以做一些像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),它将您的结构作为参数之一,并根据需要更新结构。
如果你想一次压入一个元素,你可以添加一个allocatedCount
成员,如果count == allocatedCount
,只添加realloc,新的allocatedCount
等于(例如)旧allocatedCount
的两倍。
你应该在MyIntVector_Push(MyIntVector *, int )
函数中实现它。
你将得到一个c++ std::vector<int>
的简化c版本(但是当对象超出作用域时没有自动回收)。
正如ThreeStarProgrammer57所说,只要使用realloc。
realloc(NULL, nr_of_bytes) is equivalent to malloc(nr_of_bytes)
p = realloc(p, your_new_size)
如果第一次将p初始化为NULL, 将正常工作。但是,请确保传递调整大小后所需的字节数,而不是您想要的额外空间,因为您已经写了您的问题。
关于尺寸,你必须记住它。C语言就是这样设计的