![](/img/trans.png)
[英]Assigning values from a static char array to a dynamically allocated char array
[英]Strcpy a static char array into a dynamically allocated char array to save memory
说,在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);
将静态分配的数组复制到动态分配的数组后,我们可以对它做些什么,还是让它在 memory 中腐烂? 如果是这种情况,您是否应该通过使用 malloc 创建数组的麻烦来解决 go 问题?
这只是一个假设性的问题,但是考虑到 memory 优化的最佳解决方案是什么?
以下是让您的生活更轻松的方法:
/* 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;
}
scanf 格式中的m
限定符表示:
- 可选的“m”字符。 这与字符串转换(
%s
、%c
、%[
)一起使用,并减轻调用者分配相应缓冲区来保存输入的需要:相反, scanf() 分配足够大小的缓冲区,并分配地址这个缓冲区到相应的指针参数,它应该是一个指向char *
变量的指针(这个变量不需要在调用之前初始化)。 当不再需要此缓冲区时,调用者应随后释放(3)该缓冲区。
它是标准 C 库的 Posix 扩展,因此任何希望与 Posix 兼容的实现都需要它,例如 Linux、FreeBSD 或 MacOS(但不幸的是,不是 Windows)。 因此,只要您使用这些平台之一,就很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.