C ++ char *的长度没有意义?

时间:2015-10-25 01:48:57

标签: c++ visual-c++

我今天遇到过这个问题两次,我不知道错误在哪里,也不知道如何修复它。

#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的长度与我初始化它的长度不匹配。 我该如何解决这个问题,请帮助,谢谢。

2 个答案:

答案 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