关于strlen的一个小问题

lxb365 2005-12-16 12:16:12
char* p=new char[9];
cout<<strlen(p);

答案为什么不是9?
...全文
348 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
greenteanet 2005-12-16
  • 打赏
  • 举报
回复
注意区分字符数组和字符串
bm1408 2005-12-16
  • 打赏
  • 举报
回复
strlen(p); 就是从p开始一直到NULL字符('\0')的长度.
这个才是硬道理
wzb13 2005-12-16
  • 打赏
  • 举报
回复
对不起各位,我写错了,不是为什么不=9,是为什么不=4,实际上我在VS2005下运行的结果为24,这才是让我百思不得其解的。
---------------------------------------------------------------------------------
strlen(p); 就是从p开始一直到NULL字符('\0')的长度.
char* p=new char[9]; p指向空闲存储区中分配的内存,其值是上次使用后留下的值.
losedxyz 2005-12-16
  • 打赏
  • 举报
回复
strlen(p)好像没有什么意义吧
followwater 2005-12-16
  • 打赏
  • 举报
回复
char* p=new char[9];
p[8]=0;
cout<<strlen(p);

//ok
//strlen(p)=8

yangyzqo 2005-12-16
  • 打赏
  • 举报
回复
留名,有空好好看,呵呵
lxb365 2005-12-16
  • 打赏
  • 举报
回复
而且你们的解释也文不对题啊,我说的是strlen(p),而你们解释的全是sizeof(p)
fighter_go 2005-12-16
  • 打赏
  • 举报
回复
不一定是strlen(p)不一定是4 ,可以是3,可以是8,结果估计是未定义
lxb365 2005-12-16
  • 打赏
  • 举报
回复
对不起各位,我写错了,不是为什么不=9,是为什么不=4,实际上我在VS2005下运行的结果为24,这才是让我百思不得其解的。
fiftymetre 2005-12-16
  • 打赏
  • 举报
回复
指针当然是4了
khyang 2005-12-16
  • 打赏
  • 举报
回复
你程序中那样做,如《4》所说的。"仅仅只是一个指针;很遗憾,在失去其内涵的同时,它还失去了其常量特性"
khyang 2005-12-16
  • 打赏
  • 举报
回复
估计对数组名和指针的区别不怎么清楚:

  <1> 数组名指代一种数据结构,这种数据结构就是数组;
  例如:
char str[10];
char *pStr = str;
cout << sizeof(str) << endl;
cout << sizeof(pStr) << endl;

  输出结果为:
10
4
  这说明数组名str指代数据结构char[10]。

  <2> 数组名可以转换为指向其指代实体的指针,而且是一个指针常量,不能作自增、自减等操作,不能被修改;
char str[10];
char *pStr = str;
str++; //编译出错,提示str不是左值 
pStr++; //编译正确

  <3> 指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址;

  <4> 数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;很遗憾,在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。
例如:
void arrayTest(char str[])
{
cout << sizeof(str) << endl;   //输出指针长度
    str++; //编译正确
}
int main(int argc, char* argv[])
{
 char str1[10] = "I Love U";
 arrayTest(str1);
return 0;
}
//////////////////////////////////现在推敲下,应该明白了吧
chengzanmiao 2005-12-16
  • 打赏
  • 举报
回复
zhNKUjw(淡淡的云彩悠悠的游)
==================================
說的很詳細也很具體
starwalker 2005-12-16
  • 打赏
  • 举报
回复
strlen是根据'\0'来判断的
新分配的空间里面指不定是什么
风尘雨路 2005-12-16
  • 打赏
  • 举报
回复
ding
Kvci 2005-12-16
  • 打赏
  • 举报
回复
jf
zhengguoshan 2005-12-16
  • 打赏
  • 举报
回复
同意楼上的看法. 帮着顶一下吧.楼主可以结帖了.^_^
fighter_go 2005-12-16
  • 打赏
  • 举报
回复
看看这个,你就明白了
char* p=new char[9];
strcpy(p,"hello");
cout<<strlen(p);
strcpy(p,"howareyou");
cout<<strlen(p);
zhNKUjw 2005-12-16
  • 打赏
  • 举报
回复
strlen和sizeof不同
sizeof返回的是指定类型或者变量的长度,对于指针来说,它的长度是4。
strlen返回字符串的长度,遇到'\0'认为是字符串结束。

char p[] = {'h', 'e', 'l', 'l', '0'};
cout<<strlen(p);
会发现输出的不是5,因为字符数组并非以'\0'为结尾

char *p="abcd";
cout<<strlen(p);
输出为4。字符串是以'\0'结尾的

对于char *p = new char[9];只是在堆上分配了大小为9*sizeof(char)的空间,没有初始化,所以无法预料其中的值,也就不能依据'\0'判断字符串的结束。

64,643

社区成员

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

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