游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2922|回复: 9

关于strlen

[复制链接]

33

主题

669

帖子

669

积分

高级会员

Rank: 4

积分
669
QQ
发表于 2006-2-6 13:16:00 | 显示全部楼层 |阅读模式
今天写下如此代码:
char* str= new char[3];
int len = strlen(str);
当然这两行没什么意义,只是用来做说明的
结果len = 7 , 换成别的数字也不符合
查了下资料发现如下:

在str中的内容都是随机的没有意义的乱值.str[99]中并不是NULL.而strlen是以NULL为结尾的.所以得的值也是个随机的.直到遇到了NULL才停止计算长度

strlen()是求字符串的长度。这个函数实现时,并不检查数组是否越界。
比如:
char str[4] = "abcdef";
int len = strlen(str);
求出的结果是6。它检查的字符串结束标志是'\0',而不是实际分配的空间大小

可见C函数有时候确实不安全


96

主题

529

帖子

539

积分

高级会员

Rank: 4

积分
539
发表于 2006-2-6 13:16:00 | 显示全部楼层

Re:关于strlen

谁叫你偏要用strlen,用sizeof - 1不行吗?编译后就是一常数,效率快又安全,何乐而不为?

96

主题

529

帖子

539

积分

高级会员

Rank: 4

积分
539
发表于 2006-2-6 13:21:00 | 显示全部楼层

Re:关于strlen

这就是C/C++语言的优势,用它编写程序虽然不是很高效,但是它要求程序员是站在理性的角度去理解概念,而不是感性地从字面去理解一个东西的功能。正是这种基于原理的理解,让C/C++成为一个当之无愧的中级语言,在理解并熟练的基础上,开发员能灵活运用和结合它的各种处理方式来编程序,那种感觉——太爽了!

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2006-2-6 13:34:00 | 显示全部楼层

Re:关于strlen

见楼上说起,我也来灌灌
楼主,你的变量还没有赋予值,明显是你的疏忽,而不是c不安全

50

主题

244

帖子

319

积分

中级会员

Rank: 3Rank: 3

积分
319
QQ
发表于 2006-2-7 12:49:00 | 显示全部楼层

Re:关于strlen

补充2楼的,sizeof用于数组时返回的是正常长度+1,但是用于指针时将是获取的指针长度(4)

57

主题

139

帖子

141

积分

注册会员

Rank: 2

积分
141
发表于 2006-2-7 20:12:00 | 显示全部楼层

Re:关于strlen

难道
int b[10];
sizeof(b)==41?

55

主题

263

帖子

263

积分

中级会员

Rank: 3Rank: 3

积分
263
发表于 2006-2-7 21:16:00 | 显示全部楼层

Re: 关于strlen

游戏战士: 关于strlen

今天写下如此代码:
char* str= new char[3];
int len = strlen(str);
当然这两行没什么意义,只是用来做...

大哥,亏你还是高级战士,下次千万别提这么弱智的问题
C里面的字符串就是char数组,他的特点就是0结尾
"1234" 这个字符串的所占空间是5字节,而不是4,结尾的0也要占一个字节空间
strlen("1234")=4,不要问我为什么,自己看代码
你说的strlen很笨,不检测数组访问越界,这个他无能为力。
你还犯了一个错误
char *str=new char[10];
lstrcpy(str,"1234");
难道你希望lstrlen(str)=10而不是4?

55

主题

263

帖子

263

积分

中级会员

Rank: 3Rank: 3

积分
263
发表于 2006-2-7 21:22:00 | 显示全部楼层

Re: Re:关于strlen

雨落寒星: Re:关于strlen

补充2楼的,sizeof用于数组时返回的是正常长度+1,但是用于指针时将是获取的指针长度(4)

sizeof用于数组时返回的是数组所占空间的字节数
int a[2];
sizeof (a)==sizeof(int)*2==4*2

char str[]="1234";
sizeof(str)==lstrlen(str)+1==5   //因为占用了5个字节空间

55

主题

263

帖子

263

积分

中级会员

Rank: 3Rank: 3

积分
263
发表于 2006-2-7 21:23:00 | 显示全部楼层

Re:关于strlen

int a[2];
int *p=a;
sizeof(a)==8
sizeof(p)==4

11

主题

49

帖子

55

积分

注册会员

Rank: 2

积分
55
发表于 2006-2-7 23:57:00 | 显示全部楼层

Re: Re:关于strlen

bluefire9213: Re:关于strlen

谁叫你偏要用strlen,用sizeof - 1不行吗?编译后就是一常数,效率快又安全,何乐而不为?


楼上大哥说的明白。楼主的字符串是动态创建的,所以从字符数组降级成为字符指针,失去了数组大小信息,所以sizeof得到的永远是4。

再补充一下,传递字符数组给函数时,会自动降级为字符指针,所以在函数中永远不能用sizeof求字符数组的大小。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-23 09:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表