用strlen和sizeof()有什么区别

来源:互联网 发布:北京上游网络面试 编辑:程序博客网 时间:2024/04/27 22:48
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的区别比较困惑,现在清楚了