int _tmain(int argc, _TCHAR* argv[])
{
char* myArr = new char[5];
cout << strlen(myArr) << endl;
return 0;
}
为什么它打印出12(而不是5)?基本C++存储器分配和strlen的
编辑:添加myArr [] ='\ 0';解决了这个问题。但它需要的不是我的记忆。这可以吗?
int _tmain(int argc, _TCHAR* argv[])
{
char* myArr = new char[5];
cout << strlen(myArr) << endl;
return 0;
}
为什么它打印出12(而不是5)?基本C++存储器分配和strlen的
编辑:添加myArr [] ='\ 0';解决了这个问题。但它需要的不是我的记忆。这可以吗?
内存未初始化。它在堆上有“随机”数据,所以在第一个零之前恰好有12个非零字节(并且它正在读取超过分配的长度)。
分配的内存不包含(从应用程序的角度来看)长度信息。如果你把它声明如下(与堆栈上的内存)
myArr[0] = 0;
,sizeof操作符会给“预期”值:如果您在第一个字节放一个0,则长度将是零报告为5.和delnan指出(谢谢),重要的是要注意,sizeof没有返回数组的长度,而是返回字节数。
char myArr[5];
cout << sizeof(myArr) << endl;
strlen搜索第一个空字符以确定长度。由于此内存只被分配,并未初始化,所以第一个空字符可能在任何地方。
strlen
返回以空字符结尾的字符串的长度。 new char[5]
返回一个指向内存块的指针足够大存储一个以null结尾的字符串长(4个字符+空终止符)。但是你并没有真的在那里放置一个字符串!
为什么它打印出12(而不是5)?
由于您调用了未定义的行为,因此您对未初始化的数据调用了strlen(),因此可能发生任何事情。
strlen()需要一个c字符串,即以0字节结尾的char序列。
您new char[5];
刚刚返回,这不是初始化,不适合传递给strlen的(),直到你把一个字符串中有记忆。
尝试多次运行相同的程序。有时它可能会打印一些其他的值;它可以是0,4,7,16,19等。 – Nawaz 2011-01-29 17:51:46
当你分配`char [5]`时,你的应用程序“拥有”了5个字节,所以将`myArr [3]'(第4个字节)设置为零是完全有效,尽管前3个字节仍未初始化。 – 2011-01-29 17:51:58
做myArr [5]写过数组的末尾。你搞砸了另一个数据结构(这可能会导致崩溃)。 PS。你看过std :: string。它为你做所有的内存管理。 – 2011-01-29 18:11:23