1

比如说,main();你从一个文件中读取一个字符串,并将它扫描到一个静态声明的 char 数组中。然后创建一个动态分配的 char 数组,其长度为 strlen(string)。

前任:

FILE *ifp;
char array_static[buffersize];
char *array;

fscanf(ifp, "%s", array_static);
array = malloc(sizeof(char) * strlen(array_static) + 1);
strcpy(array_static, array);

在将静态分配的数组复制到动态分配的数组后,我们可以对它做些什么,还是让它在内存中腐烂?如果是这种情况,您是否应该经历使用 malloc 创建数组的麻烦?

这只是一个假设性问题,但是考虑到内存优化的最佳解决方案是什么?

4

1 回答 1

2

以下是如何让您的生活更轻松:

/* Returns a word (delimited with whitespace) into a dynamically
 * allocated string, which is returned. Caller is responsible
 * for freeing the returned string when it is no longer needed.
 * On EOF or a read error, returns NULL.
 */
char* read_a_word(FILE* ifp) {
  char* word;
    /* Note the m. It's explained below. */
  if (fscanf(ifp, "%ms", &word) != 1)
    return NULL;
  return word;
}

mscanf 格式中的限定符表示:

  • 可选的“m”字符。这与字符串转换 ( %s, %c, %[) 一起使用,并且使调用者无需分配相应的缓冲区来保存输入:相反,scanf() 分配了一个足够大小的缓冲区,并将该缓冲区的地址分配给相应的指针参数,它应该是一个指向char *变量的指针(这个变量在调用之前不需要初始化)。当不再需要此缓冲区时,调用者应随后释放(3)此缓冲区。

它是标准 C 库的 Posix 扩展,因此任何希望与 Posix 兼容的实现都需要它,例如 Linux、FreeBSD 或 MacOS(但不幸的是,不是 Windows)。因此,只要您使用其中一个平台,就很好。

于 2021-06-17T01:45:49.233 回答