2011-01-29 8 views
2
int _tmain(int argc, _TCHAR* argv[]) 
{ 

char* myArr = new char[5]; 

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

为什么它打印出12(而不是5)?基本C++存储器分配和strlen的

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

+0

尝试多次运行相同的程序。有时它可能会打印一些其他的值;它可以是0,4,7,16,19等。 – Nawaz 2011-01-29 17:51:46

+0

当你分配`char [5]`时,你的应用程序“拥有”了5个字节,所以将`myArr [3]'(第4个字节)设置为零是完全有效,尽管前3个字节仍未初始化。 – 2011-01-29 17:51:58

+0

做myArr [5]写过数组的末尾。你搞砸了另一个数据结构(这可能会导致崩溃)。 PS。你看过std :: string。它为你做所有的内存管理。 – 2011-01-29 18:11:23

回答

5

内存未初始化。它在堆上有“随机”数据,所以在第一个零之前恰好有12个非零字节(并且它正在读取超过分配的长度)。

分配的内存不包含(从应用程序的角度来看)长度信息。如果你把它声明如下(与堆栈上的内存)

myArr[0] = 0; 

,sizeof操作符会给“预期”值:如果您在第一个字节放一个0,则长度将是零报告为5.和delnan指出(谢谢),重要的是要注意,sizeof没有返回数组的长度,而是返回字节数。

char myArr[5]; 
cout << sizeof(myArr) << endl; 
1

strlen搜索第一个空字符以确定长度。由于此内存只被分配,并未初始化,所以第一个空字符可能在任何地方。

1

strlen返回以空字符结尾的字符串的长度。 new char[5]返回一个指向内存块的指针足够大存储一个以null结尾的字符串长(4个字符+空终止符)。但是你并没有真的在那里放置一个字符串!

2

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

由于您调用了未定义的行为,因此您对未初始化的数据调用了strlen(),因此可能发生任何事情。

strlen()需要一个c字符串,即以0字节结尾的char序列。

new char[5];刚刚返回,这不是初始化,不适合传递给strlen的(),直到你把一个字符串中有记忆。