【问题标题】:Confusion about strcat with memcpy关于 strcat 与 memcpy 的混淆
【发布时间】:2017-04-30 15:18:05
【问题描述】:

好的,我已经看到了一些使用 memcpy 实现的 strcat 函数。我知道它是有效的,因为不需要分配。但是如何保留用结果字符串覆盖源字符串的内容。

例如让我们采取-:

char *str1 = "Hello";
char *str2 = "World";

str1 = strcat(str1, str2);

如何确保str2 中的内容不会被生成的“HelloWorld”字符串的内容覆盖?

此外,如果字符串只是 char 数组,并且假设数组具有固定大小,则无需重新分配内存如果我将字节复制到数组中大于数组,则不是不安全吗?

【问题讨论】:

  • 一个 only 由于重叠而调用 UB 的示例可能更符合我认为您的问题的真正意义,假设你了解strcat 的工作原理(它分配内存)。
  • 你知道指针是什么吗?你知道 String Literar 是什么吗?
  • 我们刚刚有一个关于在Code Review 上实施strcat() 的问题。 OP 使用了malloc(),因此对此与标准库方法进行了一些讨论。
  • @DavidBowling 是的,我想我的主要困惑是我没有意识到目标字符串中必须有足够的空间来保存连接的字符串。

标签: c string c-strings strcat


【解决方案1】:

这不是关于不安全,而是undefined behavior

首先,您正在尝试修改一个字符串文字,它本质上会调用 UB。

其次,关于目标缓冲区的大小,引用man page强调我的

strcat()函数追加src字符串到dest字符串,覆盖dest末尾的终止空字节('\0'),然后添加一个终止空字节。字符串不能重叠,并且dest 字符串必须有足够的空间用于结果。如果dest 不够大,程序行为是不可预测的; [...]

【讨论】:

  • 是的,如果 memcpy 给了你未定义的行为,你为什么还要使用它呢?为什么不使用 malloc 分配一个新数组并在那里使用 memcpy。
  • @ng.newbie 这不是strcpy 的设计方式。如果这是想要做的(动态分配,两个缓冲区副本,希望有一天,freecall),很好,但这不是strcpy的设计方式,所以这并不令人震惊,它的行为方式并非如此。如果您使用错误的功能,您只会得到未定义的行为。这不是功能的缺陷;这是工程师使用它的缺陷。
【解决方案2】:

我知道它是有效的,因为不需要分配。

这是一个错误的理解。 memcpystrcat 都不分配内存。两者都要求您传递指向足够有效内存的指针。如果不是这种情况,则程序会受到未定义行为的影响。

由于以下几个原因,您发布的代码会出现未定义的行为:

  1. str1 指向一个字符串文字,它位于程序的只读部分中。

  2. str1 没有足够的内存来保存字符串 "HelloWorld" 和终止空字符。

【讨论】:

  • @SouravGhosh,是的,也是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 2019-10-06
  • 1970-01-01
  • 2012-03-04
相关资源
最近更新 更多