只释放用malloc分配的一部分内存



我需要创建一个向量,在声明时我不知道它的组件数量。例如,假设向量将包含给定n以下的素数,并且在实际求值之前我无法知道有多少个素数。

当我用malloc分配内存时,我知道以后可以用free释放内存:

int main(int argc, char** argv)
{
int* p=malloc(4*sizeof(int));
for(int j=0; j<4; j++)
{
*(p+j)=2*j;
}
printf("%d %d %d %dn", *p, *(p+1), *(p+2), *(p+3));
free(p);
return 0;
}

我的想法是分配比我需要的更多的内存,然后只释放其中的一部分。所以,我天真地想做一些像int* p=malloc(1000*sizeof(int))(假设我确信p将有少于1000个组件),然后使用free(p+j),其中j是计算后我给p的有意义的组件的数量。但这是不允许的。

当然,总是有可能制作一个列表,而不是使用struct,并仅在最后创建数组,但我不喜欢这种解决方案,它对我来说似乎很复杂。

当我在声明时只知道其大小的上限时,如果数组的大小只在最后确定,那么创建数组的正确方法是什么?

使用free(p+j)是无效的,因为您只能将malloc,calloc,reallocaligned_alloc返回的指针传递给free

说到realloc,这正是你用来调整一块已分配内存大小的方法:

void *t = realloc(p, j * sizeof *p);
if (t) p = t;

注意,在realloc失败的情况下,您需要将返回的指针保存在一个单独的变量中,在这种情况下,原始指针仍然有效。

相关内容

最新更新