为什么我们需要strdup()?

时间:2010-11-02 16:31:41

标签: c

当我在完成作业时,我发现我们不应该使用如下的作业:

 char *s="HELLO WORLD";

使用此类语法的程序容易崩溃。

我尝试过并使用过:

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

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

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

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

是否分配了内存? const有什么区别??

5 个答案:

答案 0 :(得分:15)

让我们澄清一下事情。你没有特别需要strdup。它只是一个在堆上分配char*的副本的函数。它可以通过许多不同的方式完成,包括基于堆栈的缓冲区。你需要的是结果,char*的可变副本。

你列出的代码很危险的原因是它将字符串文字中的一个真正的常量字符串传递给一个需要一个可变字符串的插槽。遗憾的是,在C标准中允许这样做,但这本身就很危险。写入常量字符串会产生意外结果并经常崩溃。 strdup函数修复了问题,因为它创建了一个可变副本,该副本放在一个期望可变字符串的插槽中。

答案 1 :(得分:4)

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

答案 2 :(得分:3)

字符串文字可以存储在没有写权限的内存部分中。尝试写入它们将导致未定义的行为。 const意味着编译器确保不写入指针,从而保证不以这种方式调用未定义的行为。

答案 3 :(得分:1)

这是C中的问题。尽管字符串文字是char *,但您无法修改它们,因此它们实际上是const char*

如果您使用gcc,则可以使用-Wwrite-strings检查是否正确使用字符串文字。

答案 4 :(得分:0)

(array & string) Difference between Java and C上阅读我的回答。它包含有关字符串部分的问题的答案。

您需要了解静态和内存分配之间存在差异,并且您不会求助于相同的内存空间。