C语言 最初错配0个元素,然后重新分配和测量大小



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

问题是,对于每次调用,我需要它向数组添加一个位置,从第一次调用时的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语言就是这样设计的

相关内容

  • 没有找到相关文章

最新更新