仅释放使用malloc分配的一部分内存[重复]

93ze6v8z  于 2023-01-25  发布在  其他
关注(0)|答案(1)|浏览(149)
    • 此问题在此处已有答案**:

dynamic memory allocation in c , free some part of memory that is allocated before using malloc()(2个答案)
4天前关闭。
我需要创建一个向量,在声明时我不知道它的分量数,例如,假设向量包含小于给定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 %d\n", *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创建一个列表,然后只在末尾创建数组,但我不喜欢这种解决方案,我觉得它很复杂。
当我在声明时只知道数组大小的上限,并且数组的大小只能在最后确定时,创建数组的正确方法是什么?

hjzp0vay

hjzp0vay1#

使用free(p+j)无效,因为只能将malloccallocreallocaligned_alloc返回的指针传递给free
说到realloc,这正是您用来调整已分配内存大小的方法:

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

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

相关问题