唯有前进值得敬仰

---等得越久,相聚时越幸福
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

sizeof与strlen小结

Posted on 2011-04-07 21:30  绿豆芽33  阅读(411)  评论(1编辑  收藏  举报

最近写的一个小程序中用strlen函数求字符串长度,字符明明只有4个,可是结果求出来的长度却不是4,原来使用strlen函数要求字符串必须是以''\0''结尾的。strlen返回它的长度但不包括‘\0’(这不同于sizeof)。

这里就顺便总结一下了。

(以下均针对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可用于数据类型,使用形式:sizeoftype数据类型必须用括号括住,如sizeofint)。也可用于变量:sizeofvar_name)或sizeof var_name 

变量名可以不用括号括住。如sizeof (var_name)sizeof var_name等都是正确形式。 

注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。

3.sizeof的结果类型是size_t,它在头文件中typedefunsigned 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,从而满足第二个要求。