使用 strcat 将字符串附加到字符数组(如 char p [] = "TEST")是否有效

Is it valid to append a string to a character array like char p [] = "TEST" using strcat

本文关键字:TEST 有效 是否 char 字符串 strcat 数组 字符 使用      更新时间:2023-10-16
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
    char p [] = "TEST";
    strcat (p, "VAL");
    cout << p;
    return 0;
}

如果我的理解是正确的,像char p [] = "TEST"这样的语句将从堆栈中分配空间。当我为这样的字符串调用 strcat() 时,如何调整 p[] 的存储以适应额外的字符?

最后的cout打印"TESTVAL"。这样称呼 strcat 有效吗?如果是,这是如何工作的?我可能在理解方面有问题,但感觉我失去了联系。所以这很容易成为一个愚蠢的问题。请阐明一些信息。

存储未调整,调用无效,并且代码的行为未定义。

当你写的时候

char buffer[] = "some literal";

它被扩展到

char buffer[sizeof("some literal")] = "some literal";

它具有确切的大小来存储"some literal",仅此而已。

当您在当前缓冲区的末尾插入另一个字符串时 - 您写入超出数组的边界 - 具有未定义的行为。

另一个问题是,在C++中,我们通常使用std::string来处理字符串,它会自动为我们进行所有内存调整。

p 为

5 个字符保留空间(空终止符为 4 + 1)。 然后,您将附加另外 3 个字符,这些字符需要 8 个空间(空值为 7 + 1)。 您没有足够的空间,将覆盖堆栈。 根据您的编译器和构建设置,您可能不会看到任何差异,因为编译器会在堆栈变量之间留下空格。 在优化的发布版本中,您可能会崩溃。

如果你将代码更改为如下所示,您应该看到 sentinel1 和 2 不再是 0(这取决于编译器哪个会被丢弃)。

#include<iostream>
#include<string.h>
using namespace std;
int main()
{
    int sentinel1 = 0;
    char p [] = "TEST";
    int sentinel2 = 0;
    strcat (p, "VAL");
   cout << p << sentinel1 << sentinel2;

   return 0;
}