【问题标题】:Deallocating only a portion of the memory allocated with malloc仅释放使用 malloc 分配的一部分内存
【发布时间】:2023-01-21 03:54:30
【问题描述】:

我需要创建一个向量,在声明时我不知道其组件数量。例如,假设该向量将包含给定 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 创建一个列表,并只在最后创建数组,但我不喜欢这种解决方案,这对我来说似乎很复杂。

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

【问题讨论】:

  • 这回答了你的问题了吗? dynamic memory allocation in c , free some part of memory that is allocated before using malloc()realloc 可能是您正在寻找的选项。
  • 假设您猜到了 N 素数并且猜到了 int *p = malloc(N * sizeof *p)。如果你只使用M的元素,你可以稍后做p = realloc(p, M * sizeof *p);
  • 如果你想减少以前用malloc分配的内存块的大小,你可以使用realloc,给它新的、更小的大小。保留初始部分,但请注意地址可能会更改。

标签: c


【解决方案1】:

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

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

p = realloc(p, j * sizeof *p);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-15
    • 2014-05-27
    • 2011-10-24
    • 2020-03-08
    • 2012-12-07
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    相关资源
    最近更新 更多