当我知道char数组的最大大小时使用malloc

时间:2015-12-02 11:45:58

标签: c

在我的程序中,我是一个包含配置文件位置的字符数组,它应该是这样的: “/home/user/.config”

现在我知道最长的用户名可以是32字节长(GNU Linux),所以我知道该数组不会超过46个字符,在这种情况下我应该使用malloc吗。

我应该使用:

char config_file_location[46];
strcpy (config_file_location, getenv("HOME"));
strcat(config_file_location,"/.config");

或:

char *config_file_location;
config_file_location = (char *) malloc(43);
strcpy (config_file_location, getenv("HOME"));
strcat(config_file_location,"/.config");
//code goes here
free(config_file_location);

我也应该在上面的例子中使用realloc来使config_file_location准确使用它应该占用的内存量吗?

我正在寻找最佳实践信息,如果在这种情况下不值得做,我想知道什么时候会这样,并且我想知道哪种方法更好的原因。

谢谢,我很感激。

2 个答案:

答案 0 :(得分:2)

使用动态分配有两个原因:

  • 或者因为在编译时不知道所需的内存量,或者因为需要在运行时重新分配内存量。
  • 或者因为您需要分配大量数据并且不想用它来加载堆栈。在最坏的情况下,在堆栈上分配太多内存会导致堆栈溢出导致的神秘运行时崩溃。为避免这种情况,应该在堆上分配大量数据。

在您的情况下,您有固定数量的数据,43字节几乎不是很大。所以这里不需要使用动态分配。

除了内存泄漏和堆碎片的常见问题之外,您还必须考虑每次调用malloc(和free)都非常耗时。在动态分配可行的系统(例如Linux)上,优化速度而不是内存消耗几乎总是更有意义。

答案 1 :(得分:2)

除非你在一些真正的,真正受内存限制的环境中工作,否则我不会担心优化应用程序使用的内存量。只需在堆栈上分配一个足够大的缓冲区"为您可能遇到的最大路径。

至于有多大,没有人会给你一个明确的答案。你可以使用PATH_MAX,尽管它有noted即使有问题。在这些情况下,我会采取务实的方法,并采取类似256字节的东西。任务完成。继续前进。

相关问题