首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么strlen()可以得到字符串的长度,而sizeof不能在C中得到?

在C语言中,strlen()函数用于计算字符串的长度,而sizeof运算符用于获取变量或数据类型的大小。它们之所以有不同的功能,是因为它们操作的对象不同。

strlen()函数是一个库函数,用于计算以空字符'\0'结尾的字符串的长度。它通过遍历字符串中的字符,直到遇到空字符为止,然后返回字符的数量。这个函数只能用于计算字符串的长度,不能用于其他类型的数据。

而sizeof运算符是一个编译时运算符,用于获取变量或数据类型的大小。它返回的是对象在内存中所占的字节数。sizeof可以用于任何数据类型,包括基本数据类型、结构体、数组等。它在编译时就能确定结果,不需要运行时计算。

由于字符串在C语言中是以字符数组的形式存储的,所以可以使用sizeof来获取字符数组的大小,但是sizeof返回的是数组所占的字节数,而不是字符串的实际长度。因为字符串以空字符'\0'结尾,所以sizeof返回的大小会包括空字符在内,而不是字符串的实际长度。

综上所述,strlen()函数用于计算字符串的长度,而sizeof运算符用于获取变量或数据类型的大小。它们的功能和适用场景不同,不能互相替代。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

聊点基础--sizeof,strlen,数组,字符串在一起能整哪些坑?

来源:公众号【编程珠玑】 作者:守望先生 ID:shouwangxiansheng 对于初学者来说,sizeofstrlen,数组,字符串整在一起是痛苦,它总能在某些莫名其妙时候整一个措手不及。...另外sizeof时间复杂度是O(1)。 strlen strlen是函数 size_t strlen(const char *s); 它用于计算字符串长度。...(p));//得到5 return 0; } 这里字符串hello长度就是5,但是占用空间是多少呢?...sizeof("hello");//得到6 是6,不是5。 注:strlen时间复杂度为O(N)。 数组 关于数组,更多内容可以参考《数组之谜》。 字符串 字符串是以'\0'结尾字符数组。...很显然,str3并不是一个数组,而是一个字符指针,既然是指针类型,自然占着指针大小,64位程序,它大小就是你看到8。后者还是从str3指向地址开始,直到遇到'\0',即得到长度5。

99040

一文带你了解c++和c字符串使用

一、c++字符串表示形式: 有可能有些网友还没怎么接触到c++(c++它是一门面向对象语言,c是一门面向过程语言,所以这里可能没接触过那个面向对象网友不习惯这个用法,不过还是建议至少要掌握一门面向对象语言...(2)strlen是一个C语言库函数,这个库函数原型是:size_t strlen(const char *s);这个函数接收一个字符串指针,返回这个字符串长度(以字节为单位)。...注意一点是:strlen返回字符串长度包含字符串结尾'\0'。我们为什么需要strlen库函数?...因为从字符串定义(指针指向头、固定结尾、中间依次相连)可以看出无法直接得到字符串长度,需要用strlen函数来计算得到字符串长度。...(2)sizeof(数组名)得到永远是数组元素个数(也就是数组大小),和数组中有无初始化,初始化多、少等是没有关系strlen是用来计算字符串长度,只能传递合法字符串进去才有意义,如果随便传递一个字符指针

69720

c语言】 sizeofstrlen计算字符大小长度题目总结概括(详解)

---- sizeof sizeof可以理解为一个操作符,其作用简单说就是返回一个对象或者类型所占内存字节数。...(但也是地址) strlen strlen是一个函数,用来测量字符串实际长度(不包括‘\0’)。...(计算结果是6) strlen(&arr[0]+1)--——--表示跳过第一个元素开始计算长度(计算结果是5) 至于为什么中间4个会报错呢?...我们仔细来分析一下: strlen (*arr) --——--对arr数组名解引用操作会得到字符‘a’->ASCII码97(地址)后面不会再遇到'\0',strlen遇到'\0'才会停止,所以这种写法就是错误...提示:" const char *" 类型 实参 与 " char *" 类型 形参兼容, 函数 形参 为 char * 类型 直接写入字符串报错。

47870

C 语言】字符串操作 ( strlensizeof 函数 | 计算 字符串长度 与 内存块大小 )

文章目录 一、strlensizeof 函数 二、计算 字符串长度 与 内存块大小 一、strlensizeof 函数 ---- strlen() 函数作用是获取字符串大小 , 其原理是...从 内存某个首地址 开始计数 , 知道碰到 '\0' 字符结束 , 计算字符串长度 , 其中 计数 包含 '\0' 字符 ; 函数原型如下 : #include size_t...__cdecl strlen(const char *_Str); sizeof 函数参考 【C 语言】数据类型本质 ( sizeof 函数 | 数据类型大小 ) 一、sizeof 函数 博客章节 ;...char str[] = "abc"; 调用 strlen 函数得到 字符串长度是 3 字节 , 其计算长度时 , 不包括 ‘\0’ 字符 ; int len_str = strlen(str); 调用...sizeof 函数得到 数组长度 是 4 字节 , 此处计算是内存块大小 , 数组是数据类型 , 其本质是 固定大小内存块 别名 ; int len_array = sizeof(str); 代码示例

1.1K20

计算机小白成长历程——数组(1)

strlensizeof区别 性质不同:strlen是一个库函数,在使用strlen时需要引用头文件,sizeof是一个操作符,详细介绍见初识C语言14有兴趣朋友可以回顾一下...; 用法不同:strlen是用来计算字符串长度sizeof是用来计算数据类型/变量/数组所占空间大小。...下面我们来探讨一下数组内元素 (2)数组元素 在前面的学习,我们知道了字符串时由双引号引起单个或多个字符组成,字符串会自带一个\0字符,所以当我们将字符串赋值给数组时,实质上是将看得到字符加上...所计算答案进行对比,我们会发现数组b与数组f字符个数与strlen所计算字符长度不相同,为什么会这样呢?...通过这个例子,我们可以得到结论: strlen在计算字符串长度时,是计算字符\0之前字符个数,当一串字符没有\0时,strlen会计算出一个随机值。 接下来我们就来看看一维数组是如何使用

14550

C++学习笔记---------基础知识sizeof用法

<<sizeof(a=3)<<endl; cout<<a<<endl;    输出为什么是4,0不是期望4,3???...<sizeof(a)<<endl; // 7,字符串容量 cout<<strlen(b)<<endl; // 6,字符串长度 cout<<strlen(b)<<endl; // 20,字符串容量 cout...<<sizeof(s)<<endl; // 12, 这里代表字符串长度,而是string类大小 cout<<strlen(s)<<endl; // 错误!...到出现第一个0之间字符个数,他是在运行阶段执行sizeof得到数据大小,在这里是得到字符串容量。...strlen(s)根本就是错误,因为strlen参数是一个字符指针,如果想用strlen得到s字符串长度,应该使用sizeof(s.c_str()),因为string成员函数c_str()返回字符串首地址

54410

实例分析C语言中strlensizeof区别

C语言中strlensizeof区别 sizeof是操作符 strlen是函数 sizeof操作符返回是参数所占内存数, strlen函数返回是参数字符串长度,不是所占用内存大小。... #include int main(){ char str[10] = "hello"; printf("字符串长度为:%d\n", strlen...(str)); printf("占用内存大小为:%d\n", sizeof(str)); return 0; } 运行结果: [在这里插入图片描述] 从运行结果可以发现,strlen和...sizeof之间区别在于,通过sizeof操作符得到是定义字符数组str占用内存大小,通过strlen函数得到是对其进行初始化字符长度。...4,接下来sizeof(str)为1,这是因为str表示字符串首地址内容,在此就是字符H,占用内存大小为1字节。

72611

strlensizeof区别

1.strlen strlen=string length,即用来求字符串长度函数。...在编译器,输入一个“abcdef”这样一个字符串,在这个字符串中会隐藏一个“\0”,即字符串结束标志,所以在使用strlen函数时,遇到"\0"时就会停止读取,"\0"前字符个数就是字符串长度...); printf("%d\n", a); return 0; } 在这部分代码,定义了一个字符数组,即arr[],其中包含了'a','b','c',三个元素,用strlen函数来求他们长度,结果会是多少呢...因为strlen函数遇到'\0'时才会停止读取,arr[]并没有'\0',也就是说strlen函数并不会停止读取,直到遇到内存'\0',也就是说这个值是一个随机值。...(arr); printf("%d\n", a); return 0; } 运行结果: 此时,我们得到结果为4.因为sizeof计算是所占字节大小,所以后面隐藏'\0',也会被计算进去,所以结果为

9910

c语言strlen函数模拟实现

1.strlen函数介绍 strlen功能: 函数返回字符串str 长度( 即空值结束符之前字符数目)。...这里空值结束符号就是 ‘\0’ 在c语言中,字符串末尾通常会自动添加 ‘\0’ 作为结束标志 eg: 如果是char str[] = {‘a’,‘b’,‘c’,‘d’,‘e’};则不会添加 ‘...(str) 结果多一 这是因为strlen()函数统计’\0’ ,sizeof统计’\0’ (因为统计是整个数组大小) 在监视窗口里我们也可以证实‘\0’存在: 下面是strlen()... #include //strlen函数模拟 //字符串长度等于字符串开始和结束空字符之间字符数(不包括结束空字符本身)。...(3)指针相减法 我们知道了字符串首地址,那么我们用字符串‘\0’位置 - 字符串首地址是不是就能直接得到字符串长度呢 #define _CRT_SECURE_NO_WARNINGS #include

8510

CC++安全编码复习

2.字符串长度 对一个以空字符结尾字节字符串strlen()统计终止空字节前面的字符数量。...栈溢出的话,可以把目标代码或者数据覆盖到栈里面,关于栈为什么会溢出,其实是因为在编译后,栈大小就固定了。...任何漏洞利用主要部分都是恶意参数 恶意参数特征: 1.有漏洞程序必须接受这些参数作为合法输入. 2.参数,或其他可控制输入,必须导致有漏洞代码路径得到执行. 3.参数不能在程序将控制权转移到ShellCode...次优选择:可以使用带n替代函数,如strncpy/strncat/snprintf 需要注意是,带n版本函数会截断超出长度限制字符串,包括源字符串结尾’\0’。...派生类里析构函数一般会用于析构其内部子对象,这样就可能会造成内存泄漏。 错误示例:代码析构函数没有被定义成虚函数。

2.1K10

C语言进阶——指针进阶试题讲解(万字长文详解)

在取地址操作符(&)与解引用操作符(*)“双重折磨”下,很多人对指针望而生畏,常常会掉进规范使用指针引发错误大坑。...题3: 第三题就比较简单了,数组名就是首元素地址,对其进行解引用操作( * ),即 *a 可以得到它指向元素值,当然此题是1,1是一个 int 型数据,放在 sizeof 其实就是求 int 大小...此时 *arr 是一个具体元素值,类型匹配,运行会报错,因此此题并不会求出运算结果。 ...题12: 让我们结束报错代码学习,在第十二题中,取出来数组名地址(&arr),此时 strlen 能正常接收并进行运算, &arr 与 arr 指向地址一致,可以间接看成这题是题8翻版,因此所得到随机数也一致...题1: 在本套题组,我们得到是一个指向字符串字符型指针 p , 因为字符串在内存是连续存储可以通过首字符地址打印出整个数组。

16110

read函数返回值问题

,不是结束符'\0'大小. read函数读取包含'\0', strlen读取包含'\0' read在文件读取字符串可以包含换行符. 6....sizeof 测量是字符分配大小. 也就是说: strlen是通过找'\0'来确定字符实际长度.这一点非常关键....'这个结束符,所以strlen才能找到'\0',得到str实际字符长度为5....如果不在字符数组初始化时候加上\0,那么strlen 得到值就不是正确数值,打印出来结果也不是想要结果。因此我们要避免这种情况,在初始化时候要记得加上 \0,或者一次性赋初值。...另外: strlen结果要在运行时候才能计算出来,是用来计算字符串长度,不是类型占内存大小。大部分编译程序在编译时候就把sizeof计算过了是类型或是变量长度

2.5K10

CC++ 学习笔记五(结构体、字符与字符串

空结构体长度c为0,c++则为1。...追溯rsi赋值,可以看到最终是通过rdx传递给rsi。即sizeof计算是由rdx传递rdx初始化正是两者cc++两者不同地方(上面代码两处箭头处)。...,看出这其实是编译器做了不同事情,那为什么c空结构体大小是0c++却是1呢?...便是说空结构体在C标准是一种未定义行为,而在很多编译器(如GCC,VC)则对此做了兼容,是被允许使用。 那作为C子集C++又为什么空指针长度为1?...’\0’ 结尾,字符串一定是字符数组,它最后一个字符为’\0’ sizeofstrlen 区别 继续回到字符串、字符数组长度问题,来说下sizeofstrlen区别。

2.2K00

C语言:深入理解指针(2)

7.2 strlen      strlenC语言库函数,头文件是,功能是求字符串长度。        ...strlen参数类型是char*,str代表就是该字符串首元素地址,求字符串长度方法是从参数str这个地址开始往后,统计\0之前字符个数(字符串最后都有\0),他会一直向后找\0字符,直到找到为止...数组2:sizeof(arr2)=4,是因为arr2里存放是一个字符串字符串本身是隐藏着一个\0sizeof并不关心存储了什么数据。strlen(arr2)=3,很好理解。...数组4:sizeof(arr4)=6,根据数组2结论,sizeof也会计算字符串\0,但是为什么不是7呢?...因为创建该数组时候标明了只能存放6个元素,实际上这个数组是存放不下这个字符串,所以实际大小也只有6,为什么strlen(arr4)=33呢,因为这个数组只能存放6个元素,abcdef已经占用了6个位置了

11510

萌新不看会后悔C++基本类型总结(一)

; bool b = 0; // 在你机器上面占用多少字节,具体可以使用sizeof运算符得到: std::cout << sizeof(c); std::cout << sizeof(s);...2.sizeofstrlen区别 然后说一下sizeofstrlen区别,可能有很多萌新记不住这两个区别: sizeof() 是运算符,它不是函数,不要因为它长像函数,就上它的当,sizeof...* _Str); 该函数功能是返回字符串长度,该字符串可能是自己定义,也可能是内存随机存储,该函数实际完成功能是从代>表该字符串第一个地址开始遍历,知道遇到结束符NULL,返回长度不包括...4.有无符号类型之间运算情况        说完sizeofstrlen,继续说基本类型长度,计算机内存基本单位是位(bit),8位为一个字节,每一位有0和1两种组合,也就是说一个字节有 2 *...7.为什么浮点数没有分有无符号类型 有无符号类型说完,我们来说说文章开头留下问题,为什么浮点数没有有无符号之分: 想要使用unsigned,就意味着最高为要用来表示数据,不是正负,浮点数定义规定内存数据第一位必须是符号位

1.2K41

CC++基础之sizeof使用

C/C++ sizeof() 是一个判断数据类型或者表达式长度运算符。...1 sizeof 定义 sizeofC/C++ 一个操作符(operator),返回一个对象或者类型所占内存字节数。...运行结果为4,97;并不是4,0 说明:sizeof 不是标准意义上一元操作符,不支持链式表达式,sizeof 作用域范围内语句不会编译成机器码,如 sizeof(num++) ++ 执行。...sizeof 参数可以是数据类型,也可以是变量, strlen 只能以结尾 编译器在编译时就计算出了 sizeof 结果, strlen 函数必须在运行时才能计算出来。...并且 sizeof 计算是数据类型占内存大小, strlen 计算字符串实际长度。 数组做 sizeof 参数不退化,传递给 strlen 就退化为指针了。

33530

实例分析C语言中strlensizeof区别

区别 sizeof是操作符 strlen是函数 sizeof操作符返回是参数所占内存数, strlen函数返回是参数字符串长度,不是所占用内存大小。...需要注意是,strlen函数参数是字符串,并且必须以串结束符“\0”结尾。看看下面的代码。...:%d\n", strlen(str)); printf("占用内存大小为:%d\n", sizeof(str)); return 0; } 运行结果: 从运行结果可以发现,strlen...和sizeof之间区别在于,通过sizeof操作符得到是定义字符数组str占用内存大小,通过strlen函数得到是对其进行初始化字符长度。...= %d\n", sizeof(*str)); return 0; } 运行结果: 从运行结果发现,str占用内存大小变为4,这是因为指针在32位计算机占用4字节,所以其值为4,接下来

33330

详解sizeof()和strlen()细节及用法

sizeof ()只关注占⽤内存空间大小,不在乎内存存放什么数据。 strlen()是C语言库函数,功能是求字符串长度。...函数原型: size_t strlen ( const char * str ); 统计是从 strlen()函数参数 str 这个地址开始向后, \0 之前字符串字符个数。...还可以再深入讲一下,既然strlen()接收是一个地址,*arr是字符a,ASCII表值为97,,此时strlen()就会把97当成一个地址去访问空间,但这个地址不是我们所拥有的空间,就形成了非法访问...1.strlen(arr); 2.strlen(arr+0); 既然有了'\0'为结尾,那结果肯定就是字符串长度了,即为6 3.strlen(&arr);//这就会返回'\0'之前字符个数,即为6...a是二维数组数组名,是首元素地址,二维数组首元素是他第一行,那么a就是第一行地址,那么加一后就是第二行地址,4 / 8字节 从这我们也可以看出两个地址相差了16,正是4个整形大小,

10810
领券