我很难理解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是如何工作的?
答案 0 :(得分:3)
strcat
不为您分配新内存,确保目标缓冲区足够大是您的工作。它会简单地附加到原始字符串,假设它可以。
每篇文档都明确说明了这一点。
答案 1 :(得分:1)
当您使用strcat
时, 负责提供足够的空间。如果你忽略这样做(如你的例子),你会写入无保留的空间,这是未定义的行为。
答案 2 :(得分:1)
发生的事情是你很幸运。
strcat()
将B的内容复制到A的末尾。
在您的情况下,这似乎正是B已经存在的地方。你很幸运,你的实施并没有因此而失败。
strcat()
永远不会(重新)为字符串分配内存 - 内存必须已经存在并且足以容纳其他字符串数据。否则你会在内存中覆盖其他对象 - 这可能会导致灾难性的后果。