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<
cout<cout<cout<输出:
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的区别比较困惑,现在清楚了
阅读(1115) | 评论(0) | 转发(0) |