我正在使用char数组重新创建字符串类。我的问题是,当我为更大的数组分配内存时,它生成的数组大小完全错误。
例如:
int allocated = 4;
char * reservedString = new char[allocated];
cout << strlen(reservedString);
reservedString不会创建大小为4的字符数组,而是指向具有14个包含随机字符的点的字符数组。
这是调试显示的内容。现在,保留字符串的大小错误,其中包含一堆随机字符。当我尝试使用strcpy或strcpy_s时,由于新的数组大小错误,导致内存写越界。
如何创建长度未知的char数组,该数组由大小正确的变量提供。 我不能使用std :: string类或std :: vector。
答案 0 :(得分:1)
使用new运算符创建对象时,数据仍未初始化。您提供的代码基本上是字节数组。
有关strlen
的文档说:
计算字符串的长度,直到(但不包括终止的空字符)。
这里没有空终止符。
您应该这样做:
int allocated = 4;
char * reservedString = new char[allocated]();
这将初始化您的数组并将所有元素设置为\0
答案 1 :(得分:1)
strlen
期望以空字符结尾的字符串,这表示以空字符(\0
)结尾的字符串。您将传递给它的指针指向新分配的内存,该内存包含未初始化的值(基本上是随机的,但从技术上讲是“中间”的,读取它会导致未定义的行为)。因此,当strlen
搜索空字符以确定字符串的长度时,就会出错。
除非确定数组将以空字符或类似字符终止,否则无法确定仅提供指向数组的大小。因此,要么使用以null终止的字符串正确初始化数组,要么自己跟踪长度。