strcat() 在 C++ 中如何工作?

How does strcat() work in C++?

我很难理解 strcat 的工作原理。

char A[] = "H";
char B[] = "L";
char C[] = "12345678901234567890"; // 20 digits => 20 bytes
cout<< &A <<" "<< &B <<" "<< &C <<endl;
strcat(A,C);
cout<< &A <<" "<< &B <<" "<< &C <<endl;

输出为

0x7ffd98b99f80 0x7ffd98b99f90 0x7ffd98b99fa0
0x7ffd98b99f80 0x7ffd98b99f90 0x7ffd98b99fa0

据我了解,在运行 strcat之前,A的位置和B的位置相差0x10。这意味着,它们之间有 16 个字节的 space。在 strcat 之后,A 多了 20 个字符,这意味着它应该多占用 20 个字节。为了容纳这些额外的字符,我认为 A 或 B 被转移到一个新位置。但两者都没有发生。 A 现在在哪里存储它的所有字节? strcpy 是如何工作的?

strcat 不会为您分配新内存,确保目标缓冲区足够大是您的工作。如果可以的话,它将简单地附加到原始字符串。

这在每个文档中都有明确说明。

当您使用 strcat 时, 有责任提供足够的 space。如果您忽略这样做(如您的示例所示),您将写入未保留的 space,这是 未定义的行为

原来是你运气好。

strcat()将B的内容复制到A的末尾

在你的例子中,这似乎正是 B 已经存在的地方。您很幸运,您的实施并没有因此而失败。

strcat() 永远不会(重新)为字符串分配内存——内存必须已经存在并且足以容纳额外的字符串数据。否则您将覆盖内存中的其他对象——这可能会导致灾难性的后果。