结构体的大小以及sizeof()和strlen()的区别

一:

sizeof运算符,可用于任何变量名,类型名或常量值,当用于用于变量名(不是数组名)或常量时,它不需要圆括号。它在编译时起作用,而不是运行时。

 

PS:

求结构体的sizeof()大小有两个规则(内存对齐):

1.:上一个变量是下一个变量的整数倍。

2.:结构体整体的大小是每一个变量的整数倍。

 

例如:

struct D

{

  char a;  //1+3

  int c;   //4

  short b; //2

}   //10 +2

 

分析:结构体D中:a占用1个字节,c占用4个字节,a需要变成从c的整数倍,所以a变成1+3=4字节.

      a+b+c一共10个字节,整体需要时每一个的整数倍,所以10+2 = 12.

      12是a、b、c每一个变量的整数倍。

 

又例如:

struct A

{

  char a;  //1+2

  short b; //2

  int c;   //4

 

}   //8

 

指针的sizeof操作:所有指针变量的sizeof结果均为4.

 

经典例题:

      double* (*a)[3][6];

      cout<<sizeof(a)<<endl; // 4 a为指针

      cout<<sizeof(*a)<<endl; // 72 *a为一个有3*6个指针元素的数组

      cout<<sizeof(**a)<<endl; // 24 **a为数组一维的6个指针

      cout<<sizeof(***a)<<endl; // 4 ***a为一维的第一个指针

      cout<<sizeof(****a)<<endl; // 8 ****a为一个double变量

 

问题解析:a是一个很奇怪的定义,他表示一个指向double*[3][6]类型数组的指针。既然是指针,所以sizeof(a)就是4。 

既然a是执行double*[3][6]类型的指针,*a就表示一个double*[3][6]的多维数组类型,因此sizeof(*a)=3*6*sizeof(double*)=72。同样的,**a表示一个double*[6]类型的数组,所以sizeof(**a)=6*sizeof  (double*)=24。***a就表示其中的一个元素,也就是double*了,所以sizeof(***a)=4。至于****a,就是一个double了,所以sizeof(****a)=sizeof(double)=8。

 

-----------------------------------------------------------------

二:

strlen()函数:

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。

 

extern unsigned int strlen(char *s);

 

在Visual C++ 6.0中,原型为size_tstrlen(const char *string); ,其中size_t实际上是unsigned int,在VC6.0中可以看到这样的代码:typedef unsigned int size_t; 。

 

头文件:string.h

 

格式:strlen (字符数组名)

 

功能:计算给定字符串的(unsigned int型)长度,不包括'\0'在内

 

说明:返回s的长度,不包括结束符NUL。

 

-----------------------------------------------------------------

三、区别:

1.strlen(char *)函数求字符串实际长度,遇到字符'\0'停止,不包含符'\0'。

sizeof()返回的值变量声明后所占内存数,不是实际长度。

 

2.strlen是函数,sizeof是操作符(关键字)。

 

3.sizeof可以用类型(int,double···)做参数,也可以用函数做参数;strlen只能用char*做参数

 

4.数组做sizeof的参数不退化,而数组传递给strlen就退化为指针。

 

 

例题:

char str1[100] = "abcde";

char str2[] = "abcde";

char *str3 = "abcde";

char str4[100] = "abcde\0ijk";

char str5[] = "abcde\0ijk\n";

char *str6 = "abcde\0ijk";

printf("%d %d\n",sizeof(str1),strlen(str1));

printf("%d %d\n",sizeof(str2),strlen(str2));

printf("%d %d\n",sizeof(str3),strlen(str3));

printf("%d %d\n",sizeof(str4),strlen(str4));

printf("%d %d\n",sizeof(str5),strlen(str5));

printf("%d %d\n",sizeof(str6),strlen(str6));

 

结果:

----------------------------------------------

ps:字符串常量和字符

 

char *str1 = "abcde"; //字符串常量,保存这个字符串的首地址

char str[2] = "abcde";//字符数组

str[0] = 'x';//这句不报错,编译可通过,但不能执行.因为str[0]为*str(字符串的首地址)

str[0] = 'x';//这句正确

补充:

空结构体的大小:为1个字节。1字节用于占位。

猜你喜欢

转载自blog.csdn.net/zDavid_2018/article/details/81217217
今日推荐