int _tmain(int argc, _TCHAR* argv[])
{
char* myArr = new char[5];
cout << strlen(myArr) << endl;
return 0;
}
为什么打印出12(而不是5)?
修改:添加myArr [ 5 ] ='\ 0';解决了这个问题。但它需要的记忆不是我的。那可以吗?
答案 0 :(得分:5)
内存未初始化。它在堆上有“随机”数据,所以在第一个零之前恰好有12个非零字节(它正在读取超过分配的长度)。
分配的内存不包含(从应用程序的角度来看)长度信息。如果在第一个字节中放入0,则长度将报告为零:
myArr[0] = 0;
如果你声明如下(使用堆栈中的内存),sizeof运算符将给出“预期”值5.并且正如delnan指出的那样(感谢),重要的是要注意sizeof没有返回数组的长度,而不是字节数。
char myArr[5];
cout << sizeof( myArr ) << endl;
答案 1 :(得分:2)
为什么打印出12(而不是5)?
因为你调用了未定义的行为,你在未初始化的数据上调用了strlen(),所以任何事情都可能发生。
strlen()需要一个c字符串,这是一个以0字节结尾的char序列。
你的new char[5];
只返回未初始化的内存,并且不适合传递给strlen(),直到你在那里放置一个字符串。
答案 2 :(得分:1)
strlen搜索第一个空字符以确定长度。由于此内存仅已分配,未初始化,因此第一个空字符可能位于任何位置。
答案 3 :(得分:1)
strlen
返回以null结尾的字符串的长度。 new char[5]
返回一个指向内存块足够的指针,用于存储空终止字符串5 char
s长(4个字符+空终止符)。但是你实际上并没有把字符串放在那里!