最初分配 0 个元素以便稍后重新分配和测量大小
Initially mallocate 0 elements to later reallocate and measure size
我有一个函数,每次调用它时都会通过重新分配新内存来向数组添加新位置。
问题是,对于每次调用我都需要它向数组添加一个位置,在第一次调用时从 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)
时,它将 return 与 malloc(yourSize)
相同的值。
对于第二个问题,您可以使用包含指针和 count
成员的结构。
struct MyIntVector {
int * ptr;
size_t count;
}
那么您可能会想要为 malloc、realloc 和 free 定义包装函数(您可以在其中将 ptr
重置为 NULL),它将您的结构作为参数之一,并将结构更新为需要。
如果你想优化一次推送 1 个元素,你可以添加一个 allocatedCount
成员,并且只有在 count == allocatedCount
时才重新分配,新的 allocatedCount
等于(例如)旧 allocatedCount
.
的两倍
您应该在 MyIntVector_Push(MyIntVector *, int )
函数中实现它。
然后您将拥有一个简化的 c 版本的 c++ std::vector<int>
(但是当对象超出范围时没有自动释放)。
正如 ThreeStarProgrammer57 所说,只需使用 realloc。
realloc(NULL, nr_of_bytes) is equivalent to malloc(nr_of_bytes)
所以
p = realloc(p, your_new_size)
如果 p 被初始化为 NULL,第一次将正常工作。但是一定要传递调整大小后所需的字节数,而不是你想要的额外 space,因为你已经写了你的问题。
关于尺码,你得自己掌握。这就是 C 语言的设计方式。
我有一个函数,每次调用它时都会通过重新分配新内存来向数组添加新位置。
问题是,对于每次调用我都需要它向数组添加一个位置,在第一次调用时从 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)
时,它将 return 与 malloc(yourSize)
相同的值。
对于第二个问题,您可以使用包含指针和 count
成员的结构。
struct MyIntVector {
int * ptr;
size_t count;
}
那么您可能会想要为 malloc、realloc 和 free 定义包装函数(您可以在其中将 ptr
重置为 NULL),它将您的结构作为参数之一,并将结构更新为需要。
如果你想优化一次推送 1 个元素,你可以添加一个 allocatedCount
成员,并且只有在 count == allocatedCount
时才重新分配,新的 allocatedCount
等于(例如)旧 allocatedCount
.
您应该在 MyIntVector_Push(MyIntVector *, int )
函数中实现它。
然后您将拥有一个简化的 c 版本的 c++ std::vector<int>
(但是当对象超出范围时没有自动释放)。
正如 ThreeStarProgrammer57 所说,只需使用 realloc。
realloc(NULL, nr_of_bytes) is equivalent to malloc(nr_of_bytes)
所以
p = realloc(p, your_new_size)
如果 p 被初始化为 NULL,第一次将正常工作。但是一定要传递调整大小后所需的字节数,而不是你想要的额外 space,因为你已经写了你的问题。
关于尺码,你得自己掌握。这就是 C 语言的设计方式。