C++ 基本c++;内存分配和strlen int-tmain(int-argc,_-TCHAR*argv[] { char*myArr=新字符[5]; cout
内存未初始化。它在堆上有“随机”数据,所以在第一个零之前正好有12个非零字节(它正在读取超过分配长度的数据) 分配的内存不包含(从应用程序的角度来看)长度信息。如果在第一个字节中输入0,则长度将报告为零:C++ 基本c++;内存分配和strlen int-tmain(int-argc,_-TCHAR*argv[] { char*myArr=新字符[5]; cout,c++,C++,内存未初始化。它在堆上有“随机”数据,所以在第一个零之前正好有12个非零字节(它正在读取超过分配长度的数据) 分配的内存不包含(从应用程序的角度来看)长度信息。如果在第一个字节中输入0,则长度将报告为零: int _tmain(int argc, _TCHAR* argv[]) { char* myArr = new char[5]; cout << strlen(myArr) << endl; return 0; } 如果按如下方式声明(堆栈上有内存),si
int _tmain(int argc, _TCHAR* argv[])
{
char* myArr = new char[5];
cout << strlen(myArr) << endl;
return 0;
}
如果按如下方式声明(堆栈上有内存),sizeof运算符将给出“预期”值5。正如delnan指出的(谢谢),需要注意的是sizeof返回的不是数组的长度,而是字节数
myArr[0] = 0;
charmyarr[5];
coutstrlen搜索第一个空字符以确定长度。由于此内存仅已分配且未初始化,因此第一个空字符可以位于任何位置。strlen
返回以空结尾的字符串的长度。新字符[5]
返回一个指向足够大的内存块的指针,该内存块可以存储以null结尾的字符串5char
s长(4个字符+null结尾符)。但是,实际上您并没有将字符串放在那里
为什么要打印12(而不是5)
因为调用了未定义的行为,所以对未初始化的数据调用了strlen(),所以任何事情都可能发生
strlen()需要一个c字符串,即以0字节结尾的字符序列
您的新字符[5];
只返回未初始化且不适合传递给strlen()的内存,直到您将字符串放入其中。尝试多次运行同一程序。有时它可能会打印一些其他值;它可能是0、4、7、16、19等。分配字符[5]
时,您的应用程序“拥有”5个字节,因此将myArr[3]
(第4个字节)设置为零是完全有效的,尽管前3个字节仍然没有初始化。执行myArr[5]就是写入超过数组末尾的内容。您正在破坏另一个数据结构(这可能会导致崩溃,也可能不会导致崩溃).PS.你看过std::string了吗?它为你做了所有的内存管理。当sizeof(t)!=1
时,第二个技巧对t数组不起作用。使用sizeof(arr)/sizeof(arr[0])
。这是一个很好的观点。我将澄清sizeof操作符返回字节数(而不是元素数).4个字符长。您需要使用空终止符的5位置。
char myArr[5];
cout << sizeof( myArr ) << endl;