25.C语言 sizeof和strlen函数区别

最后更新于:2020-07-11 20:01:33

sizeof函数与strlen函数区别

C语言中,strlen函数sizeof函数都能获取字符串长度,但是两者之间到底有什么区别呢,下面我们一一道来;

1.获取字符串长度 – 针对字符串

sizeof函数数获取的长度是整个内存大小的长度,返回的长度包括'\0'strlen函数获取的长度以'\0'结尾,返回的长度不包括'\0'

a.获取常规字符串长度 – 使用strlen和sizeof都一样

char p[4] = "abc";
    printf("字符串:%s   sizeof长度:%d\n", p, sizeof(p));
    printf("字符串:%s   strlen长度:%d\n", p, strlen(p));

输出:
字符串:abc   sizeof长度:4
字符串:abc   strlen长度:3

sizeof求的是字符串在内存中的长度,所以它是加上最后的'\0'的,所以一般而言sizeof函数的长度会比strlen函数的长度多1。

b.获取非常规字符串长度 – 使用strlen和sizeof不一样

char str[100] = {0};
strcpy(str, "abcd");

int str_len = strlen(str);
int str_size = sizeof(str);

printf("strlen(str) = %d\n", (str_len));
printf("sizeof(str) = %d\n", (str_size));

输出:
strlen(str) = 4
sizeof(str) = 100

这个例子可以充分说明:strlen计算的是字符串到'\0'位置的大小,sizeof计算的字符串占的内存大小,这也是strlen函数和sizeof不同之处;

2.获取指针/数组长度 – 针对指针/数组

char p1[] = "abcdefg"; //数组
printf("字符串:%s   sizeof长度:%d\n", p1, sizeof(p1));
printf("字符串:%s   strlen长度:%d\n", p1, strlen(p1));

printf("----------------------------\n");
char* p2 = "abcdefg"; //指针
printf("字符串:%s   sizeof长度:%d\n", p2, strlen(p2));
printf("字符串:%s   strlen长度:%d\n", p2, sizeof(p2));

输出:
字符串:abcdefg   sizeof长度:8
字符串:abcdefg   strlen长度:7
----------------------------
字符串:abcdefg   sizeof长度:7
字符串:abcdefg   strlen长度:4

值得注意的是:指针占用的内存大小始终为4个字节;

3.sizeof除了能获取字符串长度之外还能获取int/double/float/结构体…内存大小

strlen函数只能计算字符串长度,sizeof能获取所有类型的内存占用大小,比如:

printf("int=%d\nshort=%d\ndouble=%d\n", sizeof(int), sizeof(short), sizeof(double));

输出:
int=4
short=2
double=8
请按任意键继续. . .

4.经典案例

/************************************************************************/
/*@文件名      : sizeof.cpp
/*@日  期      : 2020/6/23 21:52
/*@作  者      : 猿说编程
/*@公众号      : 猿说编程
/*@博客        : www.shuopython.com
/*@描述        : C语言教程 - sizeof函数获取字符串长度
/************************************************************************/

#include "stdafx.h"


#include<stdlib.h>
#include<stdio.h>
void main()
{

    int arr[] = { 1, 2, 3 };
    printf("sizeof(arr) : %d\n",sizeof(arr));
    for (int i = 0; i < sizeof(arr); i++){
        printf("%d,", arr[i]);
    }
    printf("\n");
    system("pause");
}

输出结果:
sizeof(arr) : 12
1,2,3,-858993460,9697168,11737625,1,13017304,13018680,123799719,11735310,11735310,
请按任意键继续. . .

是不是很懵逼,,除了会输出123以外,还会输出杂乱无章的数字,但一共是输出12个。因为数组的内存是动态分配的,到了元素3以后的元素都是新分配的,并不一定是空,随机数。

因为数组是一片连续的空间,有可能元素3的空间是有数据的,那么C语言会将其读取出来,当然是一些没有实际意义的杂乱无章的数字,但你不要想着去操作,否则可能导致数据错乱,所以有可能你运行好几次,后面的值都不会有变化。


正确版本如下:

int arr[] = { 1, 2, 3 };
printf("sizeof(arr)/sizeof(int) : %d\n", sizeof(arr) / sizeof(int));
for (int i = 0; i < sizeof(arr) / sizeof(int); i++){
    printf("%d,", arr[i]);
}

输出:
sizeof(arr)/sizeof(int) : 3
1,2,3,
请按任意键继续. . .


猜你喜欢

1. 三目运算符

2. 逗号表达式

3. strlen函数

4. sizeof函数

5. unicode和多字节区别




转载请注明: 猿说编程 » C/C++教程 » sizeof和strlen函数区别



技术交流、商务合作请直接联系博主
扫码或搜索:猿说编程

python/C++教程

猿说编程
微信公众号 扫一扫关注