为啥在使用 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 char
s,因为最大字符串长度已知
*(arr + i) = realloc(*(arr + i), strlen(*(arr + i)) + 1);
在这里它正在调整块的大小以完全适合字符串 i 的大小
由于输入 scanf
中提供了一个单词就足够了
【讨论】:
以上是关于为啥在使用 realloc() 进行动态内存分配之后再添加一块内存?的主要内容,如果未能解决你的问题,请参考以下文章
通过动态分配创建数组后,在C中通过realloc改变内存大小时出现问题