posts - 297,  comments - 15,  trackbacks - 0
char * fun(char *str)
{
memset(str, 0, sizeof(str));  //用strlen和sizeof()有什么区别
...
return str;
}
int main(int argc, char* argv[])
{
char *a, b[400];
a = fun(b);
}
strlen()和sizeof()出来的长度是不一样的,但结果好像都一样,memset()有那么聪明吗?


sizeof 这个是在汇编里面就存在的一个指令,可以直接返回你要判断的变量战局的内存的大?gt;>?br>这个是在编译器就确定的,一个要注意的问题是,看下面的代码
char* str=new char[100]
sizeof(str)
这个可是会返回4哦,可不是你要的400
而 char str[100]
sizeof(str)是会返回400的。
但是,无论如何strlen()都是一个函数,它返回的是一个字符串的长度,也就是说从你给的字符串
首地址开始,一直到'\0'为止的这一段长度。
memset真的没有那么智能,但是它确实高效。


strlen 返回的是实际串长
sizeof 如果*str是指针则返回 char *的大小 如果是用数组声明 返回的是空间的大小
char *sz = "abcde";
char sz1[20] = "abcde";
cout<<sizeof(sz)<<endl;
cout<<strlen(sz)<<endl;
cout<<sizeof(sz1)<<endl;
cout<<strlen(sz1)<<endl;
输出:
4
5
20
5


memset(str, 0, sizeof(str));  //用strlen和sizeof()有什么区别?
答:用sizeof的话,只给str所指向的内存块连续4个字节清0;
    用strlen的话,是给str所指向的字符串全部清0;
     
    sizeof(str)返回str这个指针变量所占的内存字节数目;
    strlen(str) 返回str所指向的字符串的长度


sizeof()应该是编译时处理的。strlen是函数,不一样的


char * fun(char *str)
{
memset(str, 0, sizeof(str));  //sizeof(str))求得是指针str的大小,指针占空间是一
                                      //样的4个字节;str指向的是数组的首地址,这样相当于
                                     //将数组前四个元素至为‘\0’,用printf("%s")的话,遇
                                    //到第一个'\0',即退出。
                                   //如果用memset(str, 0, strlen(str));就得看运气了,
                                  //str指向数组b[400]首地址,b[400]没有显示初始化,
                                 //strlen是遇到'\0'退出,有可能b[0]就是'\0'
                                //strlen(str)的结果就为0,用printf("%s")就打印不出来了;
                                //strlen(str)也有可能是其他值,得看'\0'在b[400]的哪个位置了
return str;
}
int main(int argc, char* argv[])
{
char *a, b[400];
a = fun(b);
}


char * fun(char *str)
{
memset(str, 0, sizeof(str)); //sizeof(str))求得是指针str的大小,指针占空间是一
                                  //样的4个字节;str指向的是数组的首地址,这样相当于
                                 //将数组前四个元素至为‘\0’,用printf("%s")的话,遇
                                //到第一个'\0',即退出。
                               //如果用memset(str, 0, strlen(str));就得看运气了,
                              //str指向数组b[400]首地址,b[400]没有显示初始化,
                             //strlen是遇到'\0'退出,有可能b[0]就是'\0'
                            //strlen(str)的结果就为0,用printf("%s")就打印不出来了;
                           //strlen(str)也有可能是其他值,得看'\0'在b[400]的哪个位置了
return str;
}
int main(int argc, char* argv[])
{
char *a, b[400];
a = fun(b);
}


sizeof(str))求得是指针str的大小



strlen---------测“字符个数”(包括:不可见字符,如:空格等)
sizeof---------测“BYTE个数”


sizeof返回对象所占用的字节大小.
strlen返回字符个数.
在使用sizeof时,有一个很特别的情况,就是数组名到指针蜕变,
char Array[3] = {'0'};
sizeof(Array) == 3;
char *p = Array;
sizeof(p) == 1;


在传递一个数组名到一个函数中时,它会完全退化为一个指针


学习,一直写代码,对strlen和sizeof的区别比较困惑,现在清楚了

二者的区别:
1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型保证能容纳实现所建立的最大对象的字节大小。

2.sizeof是算符,strlen是函数。

3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
sizeof还可以用函数做参数,比如:
short f();
printf("%d\n", sizeof(f()));
输出的结果是sizeof(short),即2。

4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。

5.大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;

6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。

7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
 
8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小,
 当适用一静态地空间数组, sizeof 归还全部数组的尺寸。
 sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸

9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,
如:
fun(char [8])
fun(char [])
都等价于 fun(char *)
在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小
如果想在函数内知道数组的大小, 需要这样做:
进入函数后用memcpy拷贝出来,长度由另一个形参传进去
fun(unsiged char *p1, int len)
{
  unsigned char* buf = new unsigned char[len+1]
  memcpy(buf, p1, len);
}

我们能常在用到 sizeof 和 strlen 的时候,通常是计算字符串数组的长度
看了上面的详细解释,发现两者的使用还是有区别的,从这个例子可以看得很清楚:

char str[20]="0123456789";
int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。 

上面是对静态数组处理的结果,如果是对指针,结果就不一样了

char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是

长整型的,所以是4
sizeof(*ss) 结果 1 ===》*ss是第一个字符 其实就是获得了字符串的第一位'0' 所占的内存空间,是char类

型的,占了 1 位

strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen。



posted on 2008-10-21 17:17 chatler 阅读(512) 评论(0)  编辑 收藏 引用 所属分类: C++_BASIS

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2008年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(10)

随笔分类(307)

随笔档案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感觉这个博客还是不错,虽然做的东西和我不大相关,觉得看看还是有好处的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新评论

阅读排行榜

评论排行榜