sizeof与strlen对比总结

来源:互联网 发布:淘宝店铺代运营协议 编辑:程序博客网 时间:2024/06/16 05:10

sizeof与strlen对比总结


阅读目录:

1、sizeof与strlen功能差异

2、sizeof运算符使用

3、strlen函数使用

4、一道相关面试题


一、sizeof与strlen功能差异:

sizeof()是C语言里面的一个运算符, 作用是用来返回()里面的变量或者数据类型占用的内存字节数,计算的是实际分配内存空间大小,不受里面存储的内容影响,其存在的主要价值是不同平台各种数据类型所占内存字节数不尽相同,程序中使用sizeof来判断变量/数据类型在当前环境中占几个字节。

strlen()是函数,作用是返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,实际完成功能是从对应字符串的第一个地址开始遍历,直到遇到结束符NULL(\0)。返回的长度大小不包括NULL.参数必须是字符型指针char*,当数组名作为参数传入时,实际上数组就退化成指针了。

//代码段1:char str[20]="0123456789"; int   a=strlen(str); int   b=sizeof(str); printf("strlen(str) = %d.\n", a);printf("sizeof(str) = %d.\n", b);/*a=10;strlen 计算字符串的长度,以\0'为字符串结束标记。 *//*b=20;sizeof 计算分配的数组str[20] 所占的内存空间的大小,不受里面存储的内容影响
//代码段2#include <stdio.h>#include <string.h>int main(void){    //说明:加/**/注释标记有一些丑,如果做测试,注意屏蔽    //测试用例1,最正常情况    char a[] = "windows";    printf("sizeof(a) = %d.\n", sizeof(a));     //8    printf("strlen(a) = %d.\n", strlen(a));     //7    //测试用例2、存储内容更超过申请内存大小    char a[5] = "windows";    printf("sizeof(a) = %d.\n", sizeof(a));     //5    printf("strlen(a) = %d.\n", strlen(a));     //6    //分析为什么strlen(a)长度为6,增加了一段打印代码    char a[5] = "windowswindows";    for(i =0; i<=7; i++)     {        Printf("a[i] = %c\n", a[i]);          // 结果为:w、i、n、d、o、007F、\0、\0         //前面五位正常填充,边界加了一个007F,然后是\0    }    //若恰好相等    char a[3] = "win";    for(i =0; i<=7; i++)    {        Printf("a[i] = %c\n", a[i]);          // 结果为:w、i、n、\0、\0、\0、\0         //前面三位正常填充,然后是\0    }    //测试用例3    char a[5] = "lin";    printf("sizeof(a) = %d.\n", sizeof(a));     //5    printf("strlen(a) = %d.\n", strlen(a));     //3    //测试用例4     char a[5] = {0, 1, 2, 3, 4};    printf("sizeof(a) = %d.\n", sizeof(a));     //5    printf("strlen(a) = %d.\n", strlen(a));     //0    for(i =0; i<sizeof(a)/sizeof(a[0]); i++)    {        Printf("a[i] = %c\n", a[i]);      //  \0、0001、0002、0003、0004 打印结果可以看出数字0使用\0    }    //测试用例5    char a[5] = "0linu";    printf("sizeof(a) = %d.\n", sizeof(a));     //5    printf("strlen(a) = %d.\n", strlen(a));     //6,边界字符    //测试用例6    char a[6] = "0linu";    printf("sizeof(a) = %d.\n", sizeof(a));     //6    printf("strlen(a) = %d.\n", strlen(a));     //5

小结:
sizeof()是一个运算符,返回申请内存字节大小
strlen()是一个函数,要遇到第一个\0结束,如果数组大小无法容纳所存内容加字符串结束标志\0,还有一个奇怪的越界标志,加1.


二、sizeof运算符使用:

sizeof(…)是运算符,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。

具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:

数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(32位系统为4、64位为8);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。

2.1、sizeof()测试一个变量,等同于测试它的类型

int n = 10;printf("sizeof(n) = %d.\n", sizeof(n));         // 4printf("sizeof(int) = %d.\n", sizeof(int));     // 4

2.2、sizeof()测试数组
(1)sizeof(数组名)的时候,数组名不做左值也不做右值,纯粹就是数组名的含义。那么sizeof(数组名)实际返回的是整个数组所占用内存空间(以字节为单位的)。

int b1[100] = {0};printf("sizeof(b1) = %d.\n", sizeof(b1));   // 400  100×sizeof(int)short b2[100] = {};printf("sizeof(b2) = %d.\n", sizeof(b2));       // 200 100×sizeof(short)double b3[100];printf("sizeof(b3) = %d.\n", sizeof(b3));       // 800 100×sizeof(double)

2.3、sizeof()测试指针

char str[] = "hello";  char *p = str; printf("sizeof(p) = %d.\n", sizeof(p)); // 4 相当于sizeof(char *)printf("sizeof(*p) = %d.\n", sizeof(*p));// 1 相当于sizeof(char)printf("strlen(p) = %d.\n", strlen(p)); // 5 相当于strlen(str)

2.4、sizeof()测试函数

void fun(int b[100])        {            sizeof(b)              }   

(1)函数传参,形参是可以用数组的
(2)函数形参是数组时,实际传递是不是整个数组,而是数组的首元素首地址。也就是说函数传参用数组来传,实际相当于传递的是指针(指针指向数组的首元素首地址)。

//调用部分int a[20];func(a);            // 4 因为a在函数func内部就是指针,而不是数组func1(a);       // func完全等同于func1func2(a, sizeof(a));// 定义部分void func(int a[]){    printf("数组大小 = %d.\n", sizeof(a));}void func1(int *a){    printf("数组大小 = %d.\n", sizeof(a));}void func2(int *a, int num){    // 在子函数内,a是传进来的数组的指针(首地址)    // 在子函数内,num是数组的大小}

2.5、sizeof()分辨#define与typedef

#define dpChar char *typedef char *tpChar;dpChar p1,  p2;     // 展开:char *p1, p2; 相当于char *p1, char p2;tpChar p3,  p4;     // 等价于:char *p3, char *p4;  printf("sizeof(p1) = %d.\n", sizeof(p1));       // 4printf("sizeof(p2) = %d.\n", sizeof(p2));       // 1printf("sizeof(p3) = %d.\n", sizeof(p3));       // 4printf("sizeof(p4) = %d.\n", sizeof(p4));       // 4

三、strlen函数使用:

strlen(…)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。

#include <stdio.h>#include <string.h>               //包含strlen()函数int mystrlen(char *p);int main(void){    char *p = "linux";    int len = strlen(p);    int len1 = mystrlen(p);    printf("len = %d.\n", len);    printf("len1 = %d.\n", len1);    return 0;}int mystrlen(char *p)                   //自己定义的strlen()函数{    int cnt = 0;    while(*p != '\0')    {        cnt++;        p++;        }    return cnt;}

四、一道相关面试题:

例题: const char *p = "Hello World"; char p[] = "Hello World";分别求长度和所占用空间大小,有啥区别?

答:求长度都可以用strlen(p),求占内存空间大小第一个不能用sizeof,sizeof(p)返回值为4,这等价于sizeof(char *)第二个可以用sizeof(p),这里p是数组名,其在sizeof()中既不是左值,也不是右值,纯粹就是数组名的含义。那么sizeof(数组名)实际返回的是整个数组所占用内存空间(以字节为单位的)。