int _tmain(int argc, _TCHAR* argv[])
{
char* myArr = new char[5];
cout << strlen(myArr) << endl;
return 0;
}为什么它打印出来12 (而不是5)?
编辑:添加myArr5 = '\0';修复这个问题。但它需要记忆不是我的。这样可以吗?
发布于 2011-01-29 17:40:29
内存未初始化。它在堆上有“随机”数据,所以它恰好在第一个零之前有12个非零字节(并且它正在读取超过分配的长度)。
分配的内存不包含(从应用程序的角度来看)长度信息。如果在第一个字节中放置0,那么长度将报告为零:
myArr[0] = 0;如果您按如下方式声明它(在堆栈上有内存),sizeof of运算符将给出“预期”值5。正如delnan指出的(谢谢),重要的是要注意的是,sizeof不是返回数组的长度,而是返回字节的数量。
char myArr[5];
cout << sizeof( myArr ) << endl;发布于 2011-01-29 17:43:04
为什么要打印出12 (而不是5)?
因为您调用了未定义的行为,所以对未初始化的数据调用strlen(),所以任何事情都可能发生。
strlen()需要一个c字符串,这是一个以0字节结尾的字符序列。
您的new char[5];只返回未初始化且不适合传递给strlen()的内存,直到您在其中放置一个字符串。
发布于 2011-01-29 17:41:07
strlen搜索第一个空字符以确定长度。因为这个内存只被分配,而没有初始化,所以第一个空字符可以在任何地方。
https://stackoverflow.com/questions/4838369
复制相似问题