最近写的一个小程序中用strlen函数求字符串长度,字符明明只有4个,可是结果求出来的长度却不是4,原来使用strlen函数要求字符串必须是以''\0''结尾的。strlen返回它的长度但不包括‘\
这里就顺便总结一下了。
(以下均针对x86 32bit平台)
1.先看例子。
char* ss = "0123456789";
char st[] = "0123456789";
char sa[100] = "0123456789";
struct s{
int i;
char j;
double k;
}sb;
sizeof(ss)=?
sizeof(*ss)=?
sizeof(st) =?
sizeof(*st) =?
sizeof(sa) =?
strlen(sa) =?
sizeof(sb)=?
int func(char a[100]){
sizeof(a)=?
}
(评论处有答案)
2.sizeof可用于数据类型,使用形式:sizeof(type),数据类型必须用括号括住,如sizeof(int)。也可用于变量:sizeof(var_name)或sizeof var_name
变量名可以不用括号括住。如sizeof (var_name),sizeof var_name等都是正确形式。
注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。
3.sizeof的结果类型是size_t,它在头文件中typedef为unsigned int类型。
4.当操作数是指针时,sizeof依赖于编译器,一般的指针字节数是4.
5.如果操作数是字符数组类型,其结果是数组的总字节数,包含‘\0’。
6.如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。
7.结构体类型求大小时要注意点。结构体中的成员按照定义时的顺序依次存储在连续的内存空间。和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。编译器在编译程序时会遵循两条原则:一、结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍) 二、结构体大小必须是所有成员大小的整数倍。
例如struct stu2
{
int k;
short t;
};
成员k的偏移量为0;成员t的偏移量为4,都不需要调整。但计算出来的大小为6,显然不是成员k大小的整数倍。因此,编译器会在成员t后面补上2个字节,使得结构体的大小变成8,从而满足第二个要求。