使用 strcat 将字符串附加到字符数组(如 char p [] = "TEST")是否有效
Is it valid to append a string to a character array like char p [] = "TEST" using strcat
#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;
}
相关文章:
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- GCC对可能有效的代码抛出init list生存期警告
- 有效地使用std::unordered_map来插入或增加键的值
- c++中O(n^(1/3))中一个数的除数的有效计数
- 使用无符号字符数组有效存储内存
- 自定义先决条件对移动分配运算符有效吗
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 为什么这种直接初始化有效?(C++17)
- 递归函数有效,但无法记忆
- 在C++中初始化向量映射的最有效方法
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 钳制迭代器是否有效
- 如何使用 Google Test 向测试添加元数据 / 如何将数据从 Google Test 发送到 TestEven
- 如何有效地在 std::vector 中插入一对?
- Boost.TEST with CLion: "Test framework quit unexpectedly"
- 使用 strcat 将字符串附加到字符数组(如 char p [] = "TEST")是否有效