源博客c语言详解sizeof
sizeof :得到特定类型或特定类型变量的大小
一、sizeof的概念
sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。
二、sizeof的使用方法
1、用于数据类型
sizeof使用形式: sizeof(type)
数据类型必须用括号括住: sizeof(int)
2、用于变量
sizeof使用形式: sizeof(var_name) 或 sizeof var_name
变量名可以不用括号括住.如sizeof (var_name),sizeof var_name等都是正确形式
注意:sizeof操作符不能用于函数类型,不完全类型或位字段。
例如: sizeof(max)
三、sizeof的结果(以下结果都是在Linux v2.6 gcc v4获取)
sizeof操作符的结果类型是size_t
1、ANSI C正式规定字符类型为1字节。
2、其他类型在ANSI C中没有具体规定,大小依赖于实现。
3、当操作数是指针时,sizeof依赖于编译器。
4、当操作数具有数组类型时,其结果是数组的总字节数。
int len_one = strlen(arr);
int len_two = sizeof(arr);
cout << len_one << " and " << len_two << endl;
输出结果为:5 and 10
点评:sizeof返回定义arr数组时,编译器为其分配的数组空间大小,不关心里面存了多少数据。strlen只关心存储的数据内容,不关心空间的大小和类型。
eg2、char * parr = new char[10];
int len_one = strlen(parr);
int len_two = sizeof(parr);
int len_three = sizeof(*parr);
cout << len_one << " and " << len_two << " and " << len_three << endl;
输出结果:23 and 4 and 1
点评:第一个输出结果23实际上每次运行可能不一样,这取决于parr里面存了什么(从parr[0]开始知道遇到第一个NULL结束);第二个结果实际上本意是想计算parr所指向的动态内存空间的大小,但是事与愿违,sizeof认为parr是个字符指针,因此返回的是该指针所占的空间(指针的存储用的是长整型,所以为4);第三个结果,由于*parr所代表的是parr所指的地址空间存放的字符,所以长度为1。
6、当操作数是联合类型时,sizeof是其最大字节成员的字节数。
struct a{
在Linux上: sizeof(a) = 12;
这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。
7、当操作数是函数中的数组形参或函数类型的形参:
四、sizeof与其他操作符的关系
sizeof的优先级为2级,比/、%等3级运算符优先级高。
五、sizeof的主要用途
1、主要用途是与存储分配和I/O系统那样的例程进行通信。
2、另一个的主要用途是计算数组中元素的个数。
问题一:
sizeof()返回的长度包括'\0'吗?strlen()返回长度包括'\0'吗?
问题二:
char a[5]中能放5个字符吗?如果能放,'\0'哪里去了?如:
char a[5]={'a','b','c','d','e'}/这一句成立吗?如果成立那a中的结束符在哪里?
问题三:
char *b="abcde";那b可以直接拷贝到一个char a[5]这样的数组中吗?(我的意思是说,'\0'占不占一位呀?
sizeof()返回的长度包括'\0'吗?strlen()返回长度包括'\0'吗?
问题二:
char a[5]中能放5个字符吗?如果能放,'\0'哪里去了?如:
char a[5]={'a','b','c','d','e'}/这一句成立吗?如果成立那a中的结束符在哪里?
问题三:
char *b="abcde";那b可以直接拷贝到一个char a[5]这样的数组中吗?(我的意思是说,'\0'占不占一位呀?
sizeof无关\0你申请多长就是多长,strlen不包括\0
不能
成立,但不能把它看成一个正常的字符串,只能当成字符数组
不能,占一位,通过strcpy copy的话
不能
成立,但不能把它看成一个正常的字符串,只能当成字符数组
不能,占一位,通过strcpy copy的话