Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基本c++;内存分配和strlen int-tmain(int-argc,_-TCHAR*argv[] { char*myArr=新字符[5]; cout_C++ - Fatal编程技术网

C++ 基本c++;内存分配和strlen int-tmain(int-argc,_-TCHAR*argv[] { char*myArr=新字符[5]; cout

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

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

分配的内存不包含(从应用程序的角度来看)长度信息。如果在第一个字节中输入0,则长度将报告为零:

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结尾的字符串5
char
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;