一.一些废话

  关于sizeof和strlen这两者的区别之前自己也是模糊不清,分不清谁的计算结果包含\0,谁的计算结果不包含\0,因此写下自己的一些理解,有错误的地方希望大家指出。

二.一些理论

  首先,sizeof它是一个关键字而不是函数,sizeof(int)和sizeof int,这两个计算的结果在32位系统下面结果都是4,一个有(),一个没有(),而我们都知道,函数都是带()的,因此sizeof不是函数,而是关键字。相反strlen是函数。strlen()用于计算字符串中字符的数目(也就是字符长度,以字符为单位给出字符串长度,但是一个字符占用一个字节),当它遇到\0时候就会停止,因此它计算的结果中并不包括\0在内。而sizeof关键字计算得是在内存中占用的空间,在我们初始化字符数组时候编译器会在后面自己加上\0,因此sizeof在计算时候它的结果将\0包含在内。

  strlen既然是函数,就必然涉及到参数的问题,他的参数是指针,在VC++6.0中,原型为size_t strlen(const char *string);传递的值可以是个指针也可以是个数组名(其实数组名也是一个地址),以下是百度百科的解释:strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。

三.代码说明

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
  char *str = "ABCDEFGH";
  char arr[] = "ABCDEFGH";
  int len = 0;
  int len_1 = 0;
  int len_2 = 0;
  int len_3 = 0;

  len = strlen(str);
  len_1 = sizeof(arr);
  len_2 = strlen(arr);
  len_3 = sizeof(str);
  printf("len = %d\n", len);
  printf("len_1 = %d\n", len_1);
  printf("len_2 = %d\n", len_2);
  printf("len_3 = %d\n", len_3);

  return 0;
}

输出结果:len = 8

len_1 = 9

len_2 = 8

     len_3 = 4

分析:首先定义了一个指向字符类型的指针,并初始化:char *str = "ABCDEFGH";这个时候编译器会在字符串后面自动加上\0。

      其次定义了一个字符数组,并初始化:char arr[] = "ABCDEFGH";注意此时我们并没有指定数组大小,但是我们聪明的编译器会根据字符数自主决定他的大小,并在后面加上\0。因此大家不要误以为数组的大小不确定。所以根据sizeof来计算,它们两者占用的内存空间都是9字节,strlen计算得到的字符数都是8个字符。然后sizeof(str),这是计算类型大小的经典应用,在32位系统下,指针都是占4个字节的空间。

四.拓展一下

如果将char *str = "ABCDEFGH";和char arr[] = "ABCDEFGH";改为下面的形式呢?

char str[8] = "ABCDEFGH";

char arr[8] = "ABCDEFGH";

计算的结果又是多少?

分析一下:strlen(str)等于多少?strlen(arr)等于多少?sizeof(str)和sizeof(arr)又等于多少?

Dev-C++5.2.0.3编译运行得到的结果为:len = 8, len_1 = 8,  len_2 = 16, len_3 = 8.

不同的编译器会有不同的处理方式,大家遇到类似问题时候还是要以\0的位置为准。

转载于:https://www.cnblogs.com/timemachine213/p/8321164.html

sizeof和strlen的区别相关推荐

  1. Sizeof与Strlen的区别与联系(转)

    一.sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.     它的功能是:获得保证能 ...

  2. C语言中sizeof与strlen的区别总结!

    C语言中sizeof与strlen区别总结! 先上一个例子: 结果: 一.sizeof与strlen char c[] = "abc\0cba"; 问题1:sizeof(c) = ...

  3. Sizeof与Strlen的区别与联系

    Sizeof与Strlen的区别与联系(转) 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型. 该类型保证能容纳实现所建立的最大对象的字节大小 ...

  4. C语言 - sizeof和strlen的区别

    sizeof和strlen的区别: 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型. 该类型保证能容纳实现所建立的最大对象的字节大小. 2.s ...

  5. sizeof和strlen的区别(其中涉及NUL的讲解)

    本文是自己结合平时所学的知识,对sizeof和strlen的区别进行了总结,如有不对的地方还请批评指证,共同进步!!! 一.从C语言的定义上来讲 1.sizeof是关键字,而strlen是包含在str ...

  6. C语言 sizeof 和 strlen 函数区别 - C语言零基础入门教程

    目录 一.sizeof 函数与 strlen 函数区别 1.获取字符串长度 – 针对字符串 2.获取指针/数组长度 – 针对指针/数组 3.sizeof 获取内存大小 4.经典案例 二.猜你喜欢 零基 ...

  7. 详说sizeof与strlen的区别与联系

    sizeof是C/C++中的关键字,它是一个运算符,其作用是取得一个对象(数据类型或者数据对象)的长度(即占用内存的大小,以byte为单位). 当参数分别如下时,sizeof返回的值表示的含义如下: ...

  8. 简述sizeof和strlen的区别

    sizeof和strlen的区别 属性不同: sizeof是运算符(关键字),strlen是函数 用法不同: sizeof可以使用类.结构体.共用体以及其他用户自定义的数据类型作为参数,然后计算相应的 ...

  9. sizeof与strlen的区别

    以下内容参考自<程序员面试宝典> sizeof与strlen的区别 1. sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型.该类型保证能 ...

  10. C语言中的sizeof()和strlen()的区别

    C语言中的sizeof和strlen的区别 sizeof() strlen 大量案例(想深入了解可以看) 1.(花括号int的sizeof()) 2.(花括号char的sizeof()) 3.(字符串 ...

最新文章

  1. commons-pool2-2.4.2连接池读后笔记
  2. nodejs安装及环境配置(windows系统)
  3. Servlet 的生命周期
  4. 微服务认证架构如何演进来的?
  5. Java Web Token - JWT
  6. Google 最新的 Fuchsia OS【科技讯息摘要】
  7. 十九.激光和惯导LIO-SLAM框架学习之项目工程代码介绍---代码框架和一些文件解释
  8. HTML的a标签href设为零操作的原因和方式
  9. ubuntu安装labelme
  10. (SWAT-3)SWAT土壤数据库的建立
  11. React 优化:懒惰加载(lazy loading)
  12. __kindof用法
  13. linux查看云锁密码命令,Linux安装云锁
  14. win10打开图片提示:文件系统错误:(-805305975) 解决办法!
  15. 实验记录 | 为什么mtDNA的fastq数据会比对到常染色体上?
  16. 对你来说,哪一个深度学习网络是最佳选择?(2)
  17. word文档如何在标题前面加上对应的层级数字编号
  18. polsarpro滤波后没有bmp文件_win10系统右键新建菜单中没有bmp如何解决
  19. 【机器学习基础】乡村F4带你入门线性回归 带python代码示例(一)
  20. android h5 离线缓存,H5 应用程序缓存(离线缓存)

热门文章

  1. Java获得泛型类中T的实例
  2. html5变动标签新写法,Html5新标签解释及用法
  3. c语言 sizeof size_t,C/C++中的sizeof运算符和size_t类型的详解
  4. java的引用传递_Java的值传递和引用传递
  5. oracle中pdb,Oracle12c数据库创建pdb的3种方法
  6. 阿里云消息队列 RocketMQ、Kafka 荣获金融级产品稳定性测评 “先进级” 认证
  7. 博睿数据与阿里云签订云原生核心合作伙伴计划,推动企业智能运维落地
  8. 阿里的 RocketMQ 如何让双十一峰值之下 0 故障?
  9. Serverless X OpenKruise 部署效率优化之道
  10. 云原生存储系列文章(一):云原生应用的基石