首先我们来看一下sizeof和strlen的区别: sizeof操作符的结果类型为size_t(The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.)(它在头文件用typedfe定义为unsigned int类型),计算的是分配空间的实际字节数。strlen结果类型也为size_t(size_t strlen( const char *string )),但strlen是计算的空间中字符的个数(不包括‘\0’)。 sizeof是运算符,可以以类型、函数、做参数 。strlen是函数,只能以char*(字符串)做参数。而且,要想得到的结果正确必须包含 ‘\0’(通过strlen的实现得知)。 sizeof是在编译的时候就将结果计算出来了是类型所占空间的字节数,所以以数组名做参数时计算的是整个数组的大小。而strlen是在运行的时候才开始计算结果,这是计算的结果不再是类型所占内存的大小,数组名就退化为指针了。 另外,sizeof不能计算动态分配空间的大小如: #include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char str[20] = "hello world"; char *s = (char *)malloc(20); strcpy(s, str); printf("strlen(str)=%d\n",strlen(str)); printf("sizeof(str)=%d\n",sizeof(str)); printf("strlen(s)=%d\n",strlen(s)); printf("sizeof(s)=%d\n",sizeof(s)); free(s); return 0; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 结果为: 最后的sizeof计算的是指针(sizeof(char *)) 的大小,为4。当适用了于一个结构类型时或变量, sizeof 返回实际的大小, 当适用一静态地空间数组, sizeof 归还全部数组的尺寸。 sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸。 下面我们来看一看sizeof和strlen的具体使用: 首先看几个例子 : 第一个例子: char* s = "0123456789"; sizeof(s); //结果 4 ===》s是指向字符串常量的字符指针 sizeof(*s); //结果 1 ===》*s是第一个字符 strlen(s); //结果 10 ===》有10个字符,strlen是个函数内部实现是用一个循环计算到\0为止之前 strlen(*s); //结果 10 ===》错误 char s[] = "0123456789"; sizeof(s); //结果 11 ===》s是数组,计算到\0位置,因此是10+1 strlen(s); //结果 10 ===》有10个字符,strlen是个函数内部实现是用一个循环计算到\0为止之前 sizeof(*s); //结果 1 ===》*s是第一个字符 char s[100] = "0123456789"; sizeof(s); //结果是100 ===》s表示在内存中的大小 100×1 strlen(s); //结果是10 ===》strlen是个函数内部实现是用一个循环计算到\0为止之前 int s[100] = "0123456789"; sizeof(s); //结果 400 ===》s表示再内存中的大小 100×4 strlen(s); //错误 ===》strlen的参数只能是char* 且必须是以‘\0‘结尾的 char q[]="abc"; char p[]="a\n"; sizeof(q),sizeof(p),strlen(q),strlen(p);\\结果是 4 3 3 2 char p[] = {'a','b','c','d','e','f','g','h'}; char q[] = {'a','b','c','d,'\0','e','f','g'}; sizeof(p); //结果是8 ===》p表示在内存中的大小 8×1 strlen(p); //为一个随机值,结果与编译器有关,不同编译器结果一般不同 sizeof(q); //结果是8 ===》p表示在内存中的大小 8×1 strlen(q); //结果为4 ===》存在'\0',遇到'\0'计算停止。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 第二个例子 struct Stu { int i; int j; char k; }; Stu stu; printf("%d\n",sizeof(Stu)); //结果 12 ===》内存补齐 printf("%d\n",sizeof(stu));; //结果 12 ===》内存补齐 1 2 3 4 5 6 7 8 9 这个例子是结构体的内存对齐所导致的,计算结构变量的大小就必须讨论数据对齐问题。为了CPU存取的速度最快(这同CPU取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C语言在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data alignment)。这样做可能会浪费一些内存,但理论上速度快了。当然这样的设置会在读写一些别的应用程序生成的数据文件或交换数据时带来不便,如有不理解的可以看看另外关于一篇内存对齐的博客。 ———————————————— 版权声明:本文为CSDN博主「Oragen」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/magic_world_wow/article/details/80500473 |
|