sizeof()与strlen()的区别

stonylee 2007-12-25 08:47:51
VC---sizeof()与strlen()的区别

FROM>>http://hi.baidu.com/elseif/blog/item/40ba82cea6ac5b0292457efd.html

sizeof()是计算参数所占用的内存的单元数(字节数,一个字节8位,char型正好是一个字节),那么sizeof(a)=5;sizeof(*a)=1;另外sizeof("abc")=4(不是3)我想这个很容易明白。

2. strlen(const char *),此函数在msdn里面的解释:returns the number of characters in string, excluding the terminal NULL. No return value is reserved to indicate an error。如果直接翻译,其实我测试的结果是一致的(msdn当然还是应该相信的),问题在于:它说的不够清楚,它的意思是说返回字符串的字符个数,不包括结束符NULL(参数要求是以NULL结束的字符串,我的理解应该还包括'\0'结束的)。

3. 我觉得正确的理解是,strlen()是返回字符个数,且这个个数应该是遇到null或'\0'之前的字符个数。
我们来测试:


#include <iostream.h>
#include <string.h>
void main ()
{
char a[5] ;
a[0]='a';
a[1]='c';
a[2]='\0';
a[3]='a';
a[4]='b';
cout <<sizeof(a)<<endl;
cout<<strlen(a)<<endl;
cout <<sizeof("abc")<<endl;
cout <<strlen("abc\0d")<<endl;
}
结果为
5
2
4
3


sizeof 如果*str是指针则返回 char *的大小 如果是用数组声明 返回的是空间的大小

char *sz = "abcde"; //指针占4字节,详细见下面提示
char sz1[20] = "abcde"; char *sz2[20];//4*20
cout<<sizeof(sz)<<endl;
cout<<strlen(sz)<<endl;
cout<<sizeof(sz1)<<endl;
cout<<strlen(sz1)<<endl;
cout<<sizeof(sz2)<<endl;
输出:
4
5
20
5
80


提示
C中对int型所占的字节长度并没有明确规定,只有一个最大值和最小值,所以具体实现与编译器有关,比如TC中int占两个字节,而VC中占4个字节。但是指针由于表示内存的地址,因此取决于机器的字长,即存储器地址的位数,所以普通的32位机器自然就是占4个字节了

指针的类型是由什么决定的呢?
sizeof(Type *)=??
==================
指针的大小是由内存寻址空间决定的,即地址总线决定。

一般32位机寻址空间4G,所以指针占4字节;

一般8位的单片机寻址空间是64k,所以指针占2字节。

...全文
744 52 打赏 收藏 转发到动态 举报
写回复
用AI写文章
52 条回复
切换为时间正序
请发表友善的回复…
发表回复
visame 2008-01-17
  • 打赏
  • 举报
回复
其实俺再补充一句:
sizeof(数组名)=整个数组的大小
dabie 2008-01-17
  • 打赏
  • 举报
回复
mark
mgtcllxl 2008-01-15
  • 打赏
  • 举报
回复
jf
kou_ryou 2008-01-15
  • 打赏
  • 举报
回复
很具体,辛苦了,谢谢
yupengchen951124 2008-01-15
  • 打赏
  • 举报
回复
比较容易混淆,接分是关键
fantasycai 2008-01-15
  • 打赏
  • 举报
回复
jf
u12345hn 2008-01-12
  • 打赏
  • 举报
回复
同意
guowei1651 2008-01-12
  • 打赏
  • 举报
回复
接分
mainboyy 2008-01-11
  • 打赏
  • 举报
回复
呵呵,楼上,是实验出来的。
strlen()中的参数是char *
而strlent()是计算从这个字符指针开始一直遇到'\0'的字符的个数,那么上面列举的情况,因为'\0'的出现是取决于内存中当时的情况,结果应该是随机的,而不是有规律的,我就好奇为什么会有规律呢
有高人给解答一下吗
jalloy14 2008-01-11
  • 打赏
  • 举报
回复
楼上的:平时还真没注意,真的是这个规律么,你自己总结的?
天亮后说晚安 2008-01-11
  • 打赏
  • 举报
回复
为什么 str[]={'a','b','c'}; 系统就认为长度是7呢?
编译器默认结束填充4个 cc cc cc c0 cc cc cc c0 cc cc cc c0
编译器默认结束填充3个 cc cc cc cc cc cc c0 cc cc cc c0
编译器默认结束填充2个 cc cc cc cc cc c0 cc cc cc c0
编译器默认结束填充1个 cc cc cc cc c0 cc cc cc c0
str[]={'a','b','c'}; //7
str[]={'a','b','c','d','e','f'}; //11
追究这些其实没有实际意义!
实际应用不到!
mainboyy 2008-01-10
  • 打赏
  • 举报
回复
38楼:
呵呵,你可以输出cout<<str<<endl;看一下是什么。
(1)
str[]={'a','b','c','d','e'}
长度是11
(2)
str[]={'a','b','c','d','e','f','g','h','k'}
长度是15
总结的规律是
设字符数组的长度x,vc6.0的strlen(str)的结果是y
(1)x<=4,y=7;
(2)4<x<=4n,y=7+4(n-1),n>1

呵呵,但是不知道为什么,应该不是巧合吧
gming2003 2008-01-10
  • 打赏
  • 举报
回复
好帖子,顶起来
sharedaccess 2008-01-10
  • 打赏
  • 举报
回复
对噢!

类型不一样丫.
lantu007 2008-01-10
  • 打赏
  • 举报
回复
如果 str[]这样赋值:
#include <iostream>
using namespace std;

int main()
{
char str[]={'a','b','c','\0'};
cout<<sizeof(str)<<endl;
cout<<strlen(str)<<endl;
return 0;
}

那么strlen(str)=3

为什么 str[]={'a','b','c'}; 系统就认为长度是7呢?
lantu007 2008-01-10
  • 打赏
  • 举报
回复
引自17楼:
char str[]={'a','b','c'};
sizeof(str)=3;
strlen (str)= 7;//strlen只针对字符串, str非字符串


的确,strlen(str)=7, 那么为什么是7呢?
kabunhi 2008-01-09
  • 打赏
  • 举报
回复
同意17楼的 平时没注意这么多。。。
andy59599 2008-01-09
  • 打赏
  • 举报
回复
up,学习
luojingpo 2008-01-09
  • 打赏
  • 举报
回复
有点意思,楼主继续
xxmv99 2008-01-07
  • 打赏
  • 举报
回复
顶18楼,,,

来晚了
加载更多回复(32)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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