sizeof和strlen的区别
一.一些废话
关于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的区别相关推荐
- Sizeof与Strlen的区别与联系(转)
一.sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等. 它的功能是:获得保证能 ...
- C语言中sizeof与strlen的区别总结!
C语言中sizeof与strlen区别总结! 先上一个例子: 结果: 一.sizeof与strlen char c[] = "abc\0cba"; 问题1:sizeof(c) = ...
- Sizeof与Strlen的区别与联系
Sizeof与Strlen的区别与联系(转) 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型. 该类型保证能容纳实现所建立的最大对象的字节大小 ...
- C语言 - sizeof和strlen的区别
sizeof和strlen的区别: 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型. 该类型保证能容纳实现所建立的最大对象的字节大小. 2.s ...
- sizeof和strlen的区别(其中涉及NUL的讲解)
本文是自己结合平时所学的知识,对sizeof和strlen的区别进行了总结,如有不对的地方还请批评指证,共同进步!!! 一.从C语言的定义上来讲 1.sizeof是关键字,而strlen是包含在str ...
- C语言 sizeof 和 strlen 函数区别 - C语言零基础入门教程
目录 一.sizeof 函数与 strlen 函数区别 1.获取字符串长度 – 针对字符串 2.获取指针/数组长度 – 针对指针/数组 3.sizeof 获取内存大小 4.经典案例 二.猜你喜欢 零基 ...
- 详说sizeof与strlen的区别与联系
sizeof是C/C++中的关键字,它是一个运算符,其作用是取得一个对象(数据类型或者数据对象)的长度(即占用内存的大小,以byte为单位). 当参数分别如下时,sizeof返回的值表示的含义如下: ...
- 简述sizeof和strlen的区别
sizeof和strlen的区别 属性不同: sizeof是运算符(关键字),strlen是函数 用法不同: sizeof可以使用类.结构体.共用体以及其他用户自定义的数据类型作为参数,然后计算相应的 ...
- sizeof与strlen的区别
以下内容参考自<程序员面试宝典> sizeof与strlen的区别 1. sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型.该类型保证能 ...
- C语言中的sizeof()和strlen()的区别
C语言中的sizeof和strlen的区别 sizeof() strlen 大量案例(想深入了解可以看) 1.(花括号int的sizeof()) 2.(花括号char的sizeof()) 3.(字符串 ...
最新文章
- commons-pool2-2.4.2连接池读后笔记
- nodejs安装及环境配置(windows系统)
- Servlet 的生命周期
- 微服务认证架构如何演进来的?
- Java Web Token - JWT
- Google 最新的 Fuchsia OS【科技讯息摘要】
- 十九.激光和惯导LIO-SLAM框架学习之项目工程代码介绍---代码框架和一些文件解释
- HTML的a标签href设为零操作的原因和方式
- ubuntu安装labelme
- (SWAT-3)SWAT土壤数据库的建立
- React 优化:懒惰加载(lazy loading)
- __kindof用法
- linux查看云锁密码命令,Linux安装云锁
- win10打开图片提示:文件系统错误:(-805305975) 解决办法!
- 实验记录 | 为什么mtDNA的fastq数据会比对到常染色体上?
- 对你来说,哪一个深度学习网络是最佳选择?(2)
- word文档如何在标题前面加上对应的层级数字编号
- polsarpro滤波后没有bmp文件_win10系统右键新建菜单中没有bmp如何解决
- 【机器学习基础】乡村F4带你入门线性回归 带python代码示例(一)
- android h5 离线缓存,H5 应用程序缓存(离线缓存)
热门文章
- Java获得泛型类中T的实例
- html5变动标签新写法,Html5新标签解释及用法
- c语言 sizeof size_t,C/C++中的sizeof运算符和size_t类型的详解
- java的引用传递_Java的值传递和引用传递
- oracle中pdb,Oracle12c数据库创建pdb的3种方法
- 阿里云消息队列 RocketMQ、Kafka 荣获金融级产品稳定性测评 “先进级” 认证
- 博睿数据与阿里云签订云原生核心合作伙伴计划,推动企业智能运维落地
- 阿里的 RocketMQ 如何让双十一峰值之下 0 故障?
- Serverless X OpenKruise 部署效率优化之道
- 云原生存储系列文章(一):云原生应用的基石