c-将静态的char数组转换为动态分配的char数组以节省内存



例如,在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创建数组的麻烦吗?

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

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

/* 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((分配一个足够大小的缓冲区,并将该缓冲区的地址分配给相应的指针参数,其应该是指向CCD_ 6变量的指针(该变量在调用之前不需要初始化(。当不再需要这个缓冲区时,调用者应该随后释放(3(这个缓冲区

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

相关内容

  • 没有找到相关文章

最新更新