基本的c ++内存分配和strlen

时间:2011-01-29 17:38:57

标签: c++

int _tmain(int argc, _TCHAR* argv[])
{

 char* myArr = new char[5];

 cout << strlen(myArr) << endl;
 return 0;
}

为什么打印出12(而不是5)?

修改:添加myArr [ 5 ] ='\ 0';解决了这个问题。但它需要的记忆不是我的。那可以吗?

4 个答案:

答案 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个字符+空终止符)。但是你实际上并没有把字符串放在那里!