C-sizeof和strlen区别,以及sizeof如何计算结构体大小
程序员文章站
2022-05-25 19:43:33
sizeof和strlen区别 sizeof是关键字,在编译时就能计算出值,可以计算任何类型 strlen是函数,只有在运行时才能去计算,且只能计算字符型的. 对于数组时,strlen是判断’\0’为标志结尾的,而sizeof则计算的是数组整个空间示例如下: 打印如下: 可以看到当我们的buf1没有 ......
sizeof和strlen区别
- sizeof是关键字,在编译时就能计算出值,可以计算任何类型
- strlen是函数,只有在运行时才能去计算,且只能计算字符型的.
对于数组时,strlen是判断’\0’为标志结尾的,而sizeof则计算的是数组整个空间
示例如下:
char buf1[]="abcde"; char buf2[30]="abc"; printf("buf1: %d %d\n",sizeof(buf1),strlen(buf1)); printf("buf2: %d %d\n",sizeof(buf2),strlen(buf2));
打印如下:
可以看到当我们的buf1没有指定长度时,sizeof打印的是6,这是因为它把’\0’也包含进去了.
sizeof还可以计算类型大小,一般对于32位c程序而言,对应的long则为4字节
如下图所示:
示例:
printf("char: %d\n",sizeof(char)); printf("short: %d\n",sizeof(short)); printf("int: %d\n",sizeof(int)); printf("long: %d\n",sizeof(long)); printf("long long: %d\n",sizeof(long long)); printf("float: %d\n",sizeof(float)); printf("double: %d\n",sizeof(double));
打印如下:
sizeof计算结构体大小
计算机为了加快取读结构体的内容速度,所以会对结构体进行字节对齐.
字节对齐的规律就是:结构体大小必须是最大成员的倍数(方便寻址)
示例1:
struct testa{ short a; long b; //b=4, a=1,而5%4=1,所以会在a上面补齐3字节,所以s1=8 }; struct testb{ char c; testa d; int f; //c=1,d=8,f=4,而1+8+4=13,13%8=5,还差3字节,所以会在c上面补齐3字节, s2=16 }; int main() { printf("%d\n",sizeof(testa)); printf("%d\n",sizeof(testb)); }
打印如下:
示例2:
struct testa { short a; long b; //s1=8,之前已经分析过 }; struct testb{ char c; testa d; long long f; //c=1,s1=8,f=8,由于8最大,且17%8=1,所以会在c上面补齐7字节,则s2=24 }; int main() { printf("%d\n",sizeof(testa)); printf("%d\n",sizeof(testb)); }
打印如下: