为什么我们需要strdup()?

let*_*tsc 11 c

当我在完成任务时,我发现我们不应该使用如下任务:

 char *s="HELLO WORLD";
Run Code Online (Sandbox Code Playgroud)

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

我尝试过并使用过:

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

甚至上面的工作(虽然输出是编译器和标准特定的).

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

我曾尝试在博客上阅读其他类似的问题,但无法得到上述代码为什么工作的概念.

内存分配?const有什么不同?

Jar*_*Par 15

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

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


Ign*_*ams 6

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

  • @smartmuki:这不会为堆栈上的文字分配空间,只有指向文字的指针在堆栈上。 (2认同)