在C函数中分配内存

时间:2012-05-28 07:55:02

标签: c memory memory-management memory-leaks

其内存浪费与cpu利用率问题。

如果我想合并3个字符串:

  • 方法1:我应该采用所有字符串长度(strlen)然后分配。

    char *s = malloc(strlen(s1)+strlen(s2)+strlen(s3)+1);
    

OR

  • 方法2:我应该假设1025并考虑到我知道字符串永远不会超过1025的事实。

    #define MAX 1025
    char *s = malloc(MAX);
    

请建议。

8 个答案:

答案 0 :(得分:2)

为所有3个字符串分配内存更好。

但如果你 100%(粗体,因为它非常重要)确保字符串永远不会超过固定长度,那么请继续。您必须预见您是否可能在未来添加可能超过最大长度的内容,并且您必须考虑用户输入是否会超出限制。

如果你可能不需要所有东西,你也可以分配固定缓冲区并截断字符串的其余部分,如果它太长。

如果字符串有可能长得很长(几百MB),那么就不应该使用这种方法。在这种情况下,解决方案取决于您的应用程序。

答案 1 :(得分:1)

你的malloc线看起来很好。

假设固定长度,您的另一种选择的问题是,您可能会在以后更改您的思路,而不会更改代码中的所有相应问题。

答案 2 :(得分:1)

  

方法2:我应该假设1025并考虑到我知道字符串永远不会超过1025的事实。

是的,绝对是这个。但你必须 100%肯定。总是喜欢自动存储分配。

答案 3 :(得分:1)

坦率地说,如果你要选择2,那么我建议堆栈分配(而不是malloc):

#define MAX 1025
char s[MAX];

答案 4 :(得分:1)

我假设所有字符串的总和将是< = 1024?

在这种情况下,您最好为1024分配内存(方法2)。这个内存可以反复使用。

您的方法问题1;您必须根据该特定实例的总计重新分配内存。如果您担心,这将增加您的CPU周期。

答案 5 :(得分:1)

如果你真的知道总大小永远不会超过1025或类似的相当小的值,那么尽可能通过一切方式在字符串上分配字符串。

OTOH,如果你打算使用malloc,你可以做一些额外的工作来弄清楚你需要预先分配多少。在这种情况下,当你走strlen()路由并且担心效率时,至少存储strlen()调用的结果,并使用memcpy()来构建组合结果字符串而不是str *()函数。

答案 6 :(得分:1)

您需要多少次执行此操作,您需要在内存中保留多少目标字符串?这一切都无关紧要。但是,将它放入一个返回新字符串的函数char *my_strconcat3 (const char *s1, const char *s2, const char *s3);中。然后,如果情况发生变化,您在代码中只有一个位置需要更改它。

答案 7 :(得分:1)

在C99中,如果字符串不是那么大,我喜欢这个,

 len = strlen(s1)+strlen(s2)+strlen(s3)+1;
 char s[len];

它在堆栈中称为可变长度数组,其效率高于从堆中分配内存的malloc。