我今天遇到过这个问题两次,我不知道错误在哪里,也不知道如何修复它。
#include <string.h>
char *str1 = "ab";
int length = strlen(str1);
char *str2 = new char[length + 1];
所以当我用几行来测试它时:
cout << "Length of str1 = " << strlen(str1) << "\n";
cout << "Value of int length = " << length << "\n";
cout << "Length of str2 = " << strlen(str2) << "\n";
它给了我:
str1的长度= 2
int length = 2的值
str2的长度= 48
我不明白,2 + 1应该是3. str2的长度与我初始化它的长度不匹配。 我该如何解决这个问题,请帮助,谢谢。
答案 0 :(得分:4)
strlen
函数不会测量像str2
这样的char数组的大小。它测量第一个字节的偏移量等于'\0'
。由于数组是未初始化的,因此可能在内存中的任何位置都不会在数组结束后使用。
答案 1 :(得分:2)
C字符串的长度取决于字符串的内容,而不是分配给字符串内容的内存。如果您想获得正确的长度,则必须将原始内容复制到目标字符串中,如下所示:
constant_
当char *str1 = "ab";
int length = strlen(str1);
char *str2 = new char[length + 1];
strcpy(str2, str1);
通过已分配的strlen
的末尾搜索空终止符时,你现在拥有的是未定义的行为,并且只停留了48个字节,深入到尚未分配给str2
变量的内存。
我只需要复制str1的一部分,例如str1 =“Hello World”,我需要从index = 4复制到index = 7
使用memcpy
,然后在该字符串后终止字符串:
str2