用new创建数组的大小

twlk_qywh 2009-03-25 11:28:17
#include<iostream>

using namespace std;
void main()
{

int i=0;
char t[5];
cout<<strlen(t)<<endl;//这里显示8
for(i=0;t[i]!='\0';i++)
;cout<<i<<endl;//这里显示9
char q[5]="qwer";
cout<<strlen(q)<<endl;//这里显示4 可以理解
for(i=0;q[i]!='\0';i++)
;cout<<i<<endl;//这里显示4
int aa=1;
char*ptr=new char[aa];
cout<<strlen(ptr)<<endl;//这里显示17
aa=18;
ptr=new char[aa];
cout<<strlen(ptr)<<endl;//这里33
aa=1000;
ptr=new char[aa];
cout<<strlen(ptr)<<endl;//这里1004
}

为什么显示数组大小是那么多
char t[5]数组大小应是5,但显示是8或9
为什么会这样?
...全文
574 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
chun799 2009-03-26
  • 打赏
  • 举报
回复
关注
pengzhixi 2009-03-26
  • 打赏
  • 举报
回复
strlen()函数是以'\0'为结束符的。char t[5];没有初始化所以strlen()算出任何结果都有可能
lpf000 2009-03-26
  • 打赏
  • 举报
回复
你干嘛不用,sizeof,头文件也没写完全,标点符号乱写。。。就不看编译错误的。。
m2002g 2009-03-26
  • 打赏
  • 举报
回复
char t[5];

你分配出来的数组都没有初始化,里面的内容是随机的,而strlen()是找数组中'\0',前面的字节数。

改为 char t[5]={0,};
yangch_nhcmo 2009-03-26
  • 打赏
  • 举报
回复
strlen() 读取字符串长度,读到字符串结符符'\0'才结束,如果字符数组没有初始化,其值会依当时机器运行时的内存状况而定。
beyond071 2009-03-26
  • 打赏
  • 举报
回复
学习了! char t[5]或者 char *p = new char[n]若没有初始化,是找不到字符串结尾的'\0'的...其结果未定义
ysysbaobei 2009-03-26
  • 打赏
  • 举报
回复
twlk_qywh 2009-03-26
  • 打赏
  • 举报
回复
谢谢各位了
都说得很好,分只能给最先答的了。
  • 打赏
  • 举报
回复
#include<iostream>

using namespace std;
void main()
{

int i=0;
char t[5];
cout<<strlen(t)<<endl;//这里显示8 //t每一初始化数据,所以不会在有效空间内自动加'\0',这个'\0'是越界空间的符号
for(i=0;t[i]!='\0';i++)
;cout<<i<<endl;//这里显示9 //同理
char q[5]="qwer";
cout<<strlen(q)<<endl;//这里显示4 可以理解
for(i=0;q[i]!='\0';i++)
;cout<<i<<endl;//这里显示4
int aa=1;
char*ptr=new char[aa];
cout<<strlen(ptr)<<endl;//这里显示17
aa=18;
ptr=new char[aa];
cout<<strlen(ptr)<<endl;//这里33
aa=1000;
ptr=new char[aa];
cout<<strlen(ptr)<<endl;//这里1004
}
yangf1983 2009-03-25
  • 打赏
  • 举报
回复
数组越界 完全随机啊
hylove9494 2009-03-25
  • 打赏
  • 举报
回复
随机~
tangshuiling 2009-03-25
  • 打赏
  • 举报
回复

有什么好奇怪的,strlen计算的字串以0终止,没有初始化的内存段谁都不知道0在什么位置,别说是9就是900我都信!
fox000002 2009-03-25
  • 打赏
  • 举报
回复
lz 用函数要看应用的前提条件
lingyin55 2009-03-25
  • 打赏
  • 举报
回复
打错几个字 改一下。
另外你把char t[5]初始化一下,结果就正常了。。

char t[5]这个数组都没有初始化,strlen(t)这个计算到不为'\0'的时候作为数组的长度,所以这个算出来的长度是随机的,要看从这个数组的起始位置开始到内存的哪个地方有'\0',这时才算为数组的长度,同样的,for(i=0;t[i]!='\0';i++)就比较好理解一点,从你输出的结果来看,应该是内存在从数组的首地址开始后的第9位存在一个'\0'.
lingyin55 2009-03-25
  • 打赏
  • 举报
回复
char t[5]这个数组都没有初始化,strlen(t)这个计算到不为'\0'的时候作为数组的长度,所以这个算出来的长度是随机的,要看从这个数组的起始位置开始到内存的哪个地方有'\0',这时才算为系统的长度,同样的,for(i=0;t[i]!='\0';i++)就比较好理解一点,从你输出的结果来看,应该是在从数组的首地址的第9位存在一个'\0'.
downmooner 2009-03-25
  • 打赏
  • 举报
回复
cout<<sizeof(t)<<endl;//这里显示8

strlen是用于取字符串长度

sizeof是取数组的长度 字节

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧