【问题标题】:Advantages and disadvantages of using strdup on a string literal在字符串文字上使用 strdup 的优点和缺点
【发布时间】:2010-09-21 00:47:27
【问题描述】:

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

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

str1:

  • 可以修改字符串的内容

str2:

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

还有其他区别吗?

【问题讨论】:

  • 既不是优势也不是劣势,但str2 几乎肯定应该声明为const char*。如果你想要一个可修改的短字符串,char str1[] = "some string"; 很好。

标签: c string literals strdup


【解决方案1】:

尽可能不使用,并通过以下方式之一避免使用

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

str3 如果你从不打算修改它,str4 如果你这样做。

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

【讨论】:

  • 关于str3:字符串文字的类型为char[]。将它复制到 const char[] 类型的对象(甚至是静态的)有什么意义?我认为最好只定义一个指向文字的指针并避免复制:const char *str3 = "some string";
  • str4 的开销非常浪费。每次输入str4 的范围时,程序都会执行与strcpy(str4, "some string"); 等效的操作。
  • @R.:不完全是。 char 数组的长度在编译时是固定的。所以它基本上是从一个常量地址到堆栈的memcpy。与str1 方法相比,它在幕后保存malloc 和必须在某处做的free。这就是我所说的,我想。
  • 这是一个非常简洁的成语。
【解决方案2】:

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

顺便说一句,如果字符串将被结构使用,一个很好的方法来避免必须保留一个标志来标记它是否被分配给结构是为结构和字符串分配空间(如果需要)只需致电malloc。然后,无论字符串是为结构分配的,还是从字符串文字或其他来源分配的,释放结构总是有效的。

【讨论】:

    【解决方案3】:
    1. strdup 不是 C89 也不是 C99 -> 不是 ANSI C -> 不可移植
    2. 可移植,str2 为隐式常量

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多