首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基本的c++内存分配和strlen

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

Stack Overflow用户
提问于 2011-01-29 17:38:57
回答 4查看 338关注 0票数 2
代码语言:javascript
复制
int _tmain(int argc, _TCHAR* argv[])
{

 char* myArr = new char[5];

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

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

编辑:添加myArr5 = '\0';修复这个问题。但它需要记忆不是我的。这样可以吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-29 17:40:29

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

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

代码语言:javascript
复制
myArr[0] = 0;

如果您按如下方式声明它(在堆栈上有内存),sizeof of运算符将给出“预期”值5。正如delnan指出的(谢谢),重要的是要注意的是,sizeof不是返回数组的长度,而是返回字节的数量。

代码语言:javascript
复制
char myArr[5];
cout << sizeof( myArr ) << endl;
票数 5
EN

Stack Overflow用户

发布于 2011-01-29 17:43:04

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

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

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

您的new char[5];只返回未初始化且不适合传递给strlen()的内存,直到您在其中放置一个字符串。

票数 2
EN

Stack Overflow用户

发布于 2011-01-29 17:41:07

strlen搜索第一个空字符以确定长度。因为这个内存只被分配,而没有初始化,所以第一个空字符可以在任何地方。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4838369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档