strlen和sizeof函数区别(深入理解)
2009-02-24 22:45
232 查看
1.函数类型
#include <string.h>
size_t strlen(const char *s);
size_t sizeof()
2.本质区别
本质上,strlen是函数,而sizeof是算符。strlen需要进行一次函数调用,而对于sizeof而言,因为缓冲区已经用已知字符串进行了初始化,起长度是固定的,所以sizeof在编译时计算缓冲区的长度。sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。
3.引申区别
1). strlen计算不包含终止null字节的字符串长度,而sizeof则计算包括终止null字节的缓冲区长度。
2). strlen只能用char*做参数,且必须是以'/0'结尾的。sizeof可以用类型做参数,还可以用函数做参数。数组传递给strlen就退化为指针了,传递给sizeof的参数不退化。
3). 当适用了于一个结构类型时或变量,sizeof返回实际的大小;当适用一静态地空间数组,sizeof 归还全部数组的尺寸。sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
4). 数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如:
fun(char []) 都等价于fun(char *)
在C/C++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小如果想在函数内知道数组的大小,需要这样做:
fun(const char *s, int len)
{
char* buf [len+1];
memcpy(buf, s, len);
}
5). Sizeof操作符不能用于函数类型、不完全类型或位字段。不完全类型是指具有未知存储大小的数据数据类型,如未知存储大小的数组类型,void类型等。
4.sizeof另解
程序存储分布有三个区域:栈、静态和动态。所有能够从代码直接操作的对象,包括任何类型的变量、指针,都是在栈上的;动态和静态存储区是靠栈上的指针间接操作的。sizeof 操作符,计算的是对象在栈上的投影体积;除了栈上的char数组这一个特殊情况之外。。。
sizeof计算的都是类型的长度。如果是对象,则转换成类型,再计算类型的长度。
在32位系统中。指针类型是32位,4个字节。所以对任何指针用sizeof结果都是4;
1). 数组用sizeof = 数组的步长(类型的长度)*数组的长度。
2). 复合结构sizeof= 各个数据成员的类型长度*声明的个数之和。(要考虑到字节对齐)
typedef struct student
{
int data;
static int number;
} node1;
typedef struct teacher
{
int data;
char name;
} node2;
sizeof(node1)=4个字节。//静态变量是放在全局数据区,sizeof计算栈分配的大小,不会计算静态变量的。
sizeof(node2)=8个字节。//字节对齐
3). 引用用 sizeof 。 如果引用的是对象,则先转化成引用的对象类型。如果是复合类型。则用2。否则直接计算。
#include <string.h>
size_t strlen(const char *s);
size_t sizeof()
2.本质区别
本质上,strlen是函数,而sizeof是算符。strlen需要进行一次函数调用,而对于sizeof而言,因为缓冲区已经用已知字符串进行了初始化,起长度是固定的,所以sizeof在编译时计算缓冲区的长度。sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。
3.引申区别
1). strlen计算不包含终止null字节的字符串长度,而sizeof则计算包括终止null字节的缓冲区长度。
2). strlen只能用char*做参数,且必须是以'/0'结尾的。sizeof可以用类型做参数,还可以用函数做参数。数组传递给strlen就退化为指针了,传递给sizeof的参数不退化。
3). 当适用了于一个结构类型时或变量,sizeof返回实际的大小;当适用一静态地空间数组,sizeof 归还全部数组的尺寸。sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
4). 数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如:
fun(char []) 都等价于fun(char *)
在C/C++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小如果想在函数内知道数组的大小,需要这样做:
fun(const char *s, int len)
{
char* buf [len+1];
memcpy(buf, s, len);
}
5). Sizeof操作符不能用于函数类型、不完全类型或位字段。不完全类型是指具有未知存储大小的数据数据类型,如未知存储大小的数组类型,void类型等。
4.sizeof另解
程序存储分布有三个区域:栈、静态和动态。所有能够从代码直接操作的对象,包括任何类型的变量、指针,都是在栈上的;动态和静态存储区是靠栈上的指针间接操作的。sizeof 操作符,计算的是对象在栈上的投影体积;除了栈上的char数组这一个特殊情况之外。。。
sizeof计算的都是类型的长度。如果是对象,则转换成类型,再计算类型的长度。
在32位系统中。指针类型是32位,4个字节。所以对任何指针用sizeof结果都是4;
1). 数组用sizeof = 数组的步长(类型的长度)*数组的长度。
2). 复合结构sizeof= 各个数据成员的类型长度*声明的个数之和。(要考虑到字节对齐)
typedef struct student
{
int data;
static int number;
} node1;
typedef struct teacher
{
int data;
char name;
} node2;
sizeof(node1)=4个字节。//静态变量是放在全局数据区,sizeof计算栈分配的大小,不会计算静态变量的。
sizeof(node2)=8个字节。//字节对齐
3). 引用用 sizeof 。 如果引用的是对象,则先转化成引用的对象类型。如果是复合类型。则用2。否则直接计算。
相关文章推荐
- strlen和sizeof函数区别(深入理解)
- 深入理解sizeof与strlen的区别
- strlen()函数和sizeof()运算符的区别
- strlen函数与sizeof函数的区别及应用
- sizeof 和 strlen 的深入理解
- 深入理解sizeof()函数
- 深入理解c语言中字符串处理函数strlen,strcpy,strcat,strcmp
- C++ 深入理解sizeof(),strlen()和内存补齐
- sizeof()于strlen()函数的区别
- sizeof与strlen函数的区别
- 关于sizeof运算符和strlen()函数的个别区别分析
- 对于sizeof()和strlen()的深入理解
- linux C --深入理解字符串处理函数 strlen() strcpy() strcat() strcmp()
- 重写string.h中的字符串操作函数--strlen,strlen 与sizeof的区别
- 深入理解sizeof和strlen
- 深入理解sizeof 和 strlen
- C语言中strlen()函数和sizeof()函数区别[关于字符串长度]
- 对比C++中sizeof与strlen函数的区别
- js函数声明语句与函数表达式的区别深入理解
- linux C --深入理解字符串处理函数 strlen() strcpy() strcat() strcmp()