在字符串文字上使用strdup的优点和缺点

时间:2010-09-21 00:47:28

标签: c string literals strdup

我想清楚以下代码的所有优点/缺点:

{
    char *str1 = strdup("some string");
    char *str2 = "some string";
    free(str1);
}

STR1:

  • 您可以修改字符串
  • 的内容

STR2:

  • 您不必使用free()
  • 更快

还有其他差异吗?

3 个答案:

答案 0 :(得分:3)

如果可以,请不要使用以下任何一项

static char const str3[] = { "some string" };
char str4[] = { "some string" };

str3如果你从未计划修改它,str4如果你这样做。

str3确保程序中没有其他函数可以修改字符串(字符串文字可以共享可变)。 str4在堆栈上分配一个常量大小的数组,因此分配和释放没有任何开销。系统只需复制您的数据。

答案 1 :(得分:2)

使用原始字符串 - 无论是源代码中的文字,内存映射文件的一部分,还是程序另一部分“拥有”的分配字符串 - 都具有节省内存,可能消除丑陋的优点如果执行分配(可能会失败),则必须处理的错误条件。当然,缺点是你必须跟踪这个字符串不是由当前使用它的代码“拥有”的事实,因此它不能被修改/释放。有时这意味着您需要在结构中使用一个标志来指示它使用的字符串是否为结构分配。对于较小的程序,它可能只意味着你必须通过几个函数手动遵循字符串所有权的逻辑,并确保它是正确的。

顺便说一句,如果字符串将由一个结构使用,那么一个很好的方法来保持一个标记是否为结构分配的标志是为结构和字符串分配空间(如果需要)只需拨打malloc。然后,释放结构总是正常工作,无论字符串是为结构分配还是从字符串文字或其他来源分配。

答案 2 :(得分:0)

  1. strdup不是C89而不是C99 - >不 ANSI C - >不便携
  2. 是可移植的,str2是隐式const