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

时间:2015-11-15 22:29:41

标签: c++ strcat

我很难理解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个字节的空间。在strcat之后,A还有20个字符,这意味着它应该占用20个字节。为了容纳这些额外的字符,我认为A或B都转移到了一个新的位置。但都没有发生。 A在哪里存储它的所有字节? strcpy是如何工作的?

3 个答案:

答案 0 :(得分:3)

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

每篇文档都明确说明了这一点。

答案 1 :(得分:1)

当您使用strcat时, 负责提供足够的空间。如果你忽略这样做(如你的例子),你会写入无保留的空间,这是未定义的行为

答案 2 :(得分:1)

发生的事情是你很幸运。

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

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

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