strlen和sizeof

#include <stdio.h>

int main()
{
    char *p1=NULL;
    printf("strlen(p1)=%d\n",strlen(p1));
    return 0;
}

编译会提醒但不会报错,运行报段错误

#include <stdio.h>

int main()
{
    char *p1=NULL;
    printf("sizeof(p1)=%d\n",sizeof(p1));
    return 0;
}

32位机器为4,32位机器地址范围为32bit,也就是4字节

#include <stdio.h>

int main()
{
    char *p2="abcde";
    printf("strlen(p2)=%d\n",strlen(p2));
    printf("sizeof(p2)=%d\n",sizeof(p2));
    return 0;
}

结果为5
32位机器为4

一、sizeof 运算符:计算所占的字节大小
sizeof()是单目运算符(同++、–类似的运算符),其值在编译时就已经计算好了,参数可以是数组、指针、类型、对象、函数等。注意:sizeof不是一个函数,它是一个运算符,所以它不需要包含任何头文件。
它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(在32位机器上是4,64位机器上是8);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
二、strlen函数: 字符串的具体长度即字符个数
strlen是C语言的库函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度。
该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符’\0’停止。返回的长度大小不包括‘\0’。它的返回值是size_t类型,也就是unsigned int类型,返回的是字符串的长度,需要包含头文件#inlude <string.h>,参数s是字符串首地址。

总结一下二者的区别
二者的区别主要是以下四点:
sizeof会将空字符\0计算在内,而strlen不会将空字符\0计算在内;
sizeof()是运算符,strlen()是库函数
sizeof()在编译时计算好了,strlen()在运行时计算
sizeof()计算出对象使用的最大字节数,strlen()计算字符串的实际长度
sizeof()的参数类型多样化(数组,指针,对象,函数都可以),strlen()的参数必须是字符型指针(传入数组时自动退化为指针)
sizeof会计算到字符串最后一个空字符\0并结束,而strlen如果遇到第一个空字符\0的话就会停止并计算遇到的第一个空字符\0前面的长度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值