为啥在使用 realloc() 进行动态内存分配之后再添加一块内存?

Posted

技术标签:

【中文标题】为啥在使用 realloc() 进行动态内存分配之后再添加一块内存?【英文标题】:Why add one more block of memory after dynamic memory allocation using realloc()?为什么在使用 realloc() 进行动态内存分配之后再添加一块内存? 【发布时间】:2020-12-12 18:30:00 【问题描述】:

Hackerrank 上的字符串排序问题有一个循环来获取二维字符串数组中的输入。此循环使用malloc() 为每个字符串动态分配内存,使用scanf() 获取输入,然后再为该块重新分配一个块。

int n;
scanf("%d", &n);
  
char** arr;
arr = (char**)malloc(n * sizeof(char*));
  
for(int i = 0; i < n; i++)
    *(arr + i) = malloc(1024 * sizeof(char));
    scanf("%s", *(arr + i));
    *(arr + i) = realloc(*(arr + i), strlen(*(arr + i)) + 1);

链接:https://www.hackerrank.com/challenges/sorting-array-of-strings/problem

我有两个问题:

    为什么要使用额外的内存块? 为什么使用scanf()而不是fgets()来获取字符串输入?这不是一个好习惯吗?

【问题讨论】:

【参考方案1】:

    *(arr + i) = malloc(1024 * sizeof(char));

    它为第 i 个字符串分配 1024 chars,因为最大字符串长度已知

    *(arr + i) = realloc(*(arr + i), strlen(*(arr + i)) + 1);

    在这里它正在调整块的大小以完全适合字符串 i 的大小

    由于输入 scanf 中提供了一个单词就足够了

【讨论】:

以上是关于为啥在使用 realloc() 进行动态内存分配之后再添加一块内存?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以使用 realloc 来释放动态分配的内存吗?

动态分配内存-realloc

通过动态分配创建数组后,在C中通过realloc改变内存大小时出现问题

C语言中动态内存分配函数的用法及作用?(比如malloc,calloc,realloc等)

动态内存分配的补充 realloc和calloc函数

系统C/C++内存管理之内存分配