代码之家  ›  专栏  ›  技术社区  ›  letsc

为什么我们需要strdup()?

c
  •  11
  • letsc  · 技术社区  · 15 年前

    当我在做作业的时候,我开始知道我们不应该使用这样的作业:

     char *s="HELLO WORLD";
    

    使用这种语法的程序容易崩溃。

    我尝试并使用:

     int fun(char *temp)
     {
        // do sum operation on temp
        // print temp.
      }
      fun("HELLO WORLD");
    

    即使是上面的工作(尽管输出是编译器和标准特定的)。

    相反,我们应该尝试strdup()或使用const char*

    我试过在博客上阅读其他类似的问题,但无法理解为什么上面的代码不能工作。

    5 回复  |  直到 15 年前
        1
  •  15
  •   JaredPar    15 年前

    让我们澄清一下。你根本不需要 strdup char* 在堆里。它可以用很多不同的方法完成,包括使用基于堆栈的缓冲区。你需要的是结果,一个 字符*

    您列出的代码之所以危险,是因为它将字符串文本的from中的常量字符串传递到一个需要可变字符串的槽中。不幸的是,这在C标准中是允许的,但我有极大的危险。写入常量字符串将产生意外结果,并经常崩溃。这个 strdup公司 修复 这个问题是因为它创建了一个可变副本,该副本被放置到一个槽中,期望有可变字符串。

        2
  •  4
  •   Ignacio Vazquez-Abrams    15 年前

    字符串文字存储在程序的数据段中。操作指针将修改字符串文字,这可能导致。。。最好是奇怪的结果。使用 strdup() 将它们复制到堆或堆栈分配的空间。

        3
  •  3
  •   Puppy    15 年前

    字符串文字可能存储在内存中没有写入权限的部分。试图给他们写信会导致不确定的行为。const意味着编译器确保指针不被写入,保证您不会以这种方式调用未定义的行为。

        4
  •  1
  •   Å imon Tóth    15 年前

    这是C语言中的一个问题 char * 你不能修改它们,所以它们是有效的 const char* .

    如果你正在使用 gcc ,您可以使用 -Wwrite-strings

        5
  •  0
  •   Community Mohan Dere    9 年前

    读我的答案 (array & string) Difference between Java and C . 它包含了关于字符串部分的问题的答案。