strlen和sizeof的对比

ABAP Cloud 开发教程的文章目录 本教程涵盖 ABAP 云端 Client 处理、多租户架构、ABAP Cloud开发、动态编程优化、SQL语法改进等技术主题。最新版本1.0.0(更新至2025-12-12),包含197篇文章,重点文章包括《ABAP Client Handling与隔离机制》《ABAP Platform 2021泛型编程》《SAP BTP ABAP多租户应用开发》等,为开发者提供从基础到进阶的实战指南。 阅读详情
strlen是什么:

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。

函数简介:

原型:extern unsigned int strlen(char *s);,在Visual C++ 6.0中,原型为size_t strlen( const char *string );,其中size_t实际上是unsigned int,在VC6.0中可以看到这样的代码:typedef unsigned int size_t;。

   头文件:string.h
   格式:strlen (字符数组名)
   功能:计算字符串s的(unsigned int型)长度,不包括'\0'在内
   说明:返回s的长度,不包括结束符NULL。
   相关函数:
  
TCHAR.H routine_UNICODE & _MBCS not defined_MBCS defined_UNICODE defined
_tcslenstrlenstrlenwcslen
_tcsclenstrlen_mbslenwcslen
举例1:(在Visual C++6.0中运行通过)
  #include <string.h>
  #include<stdio.h>
  int main(void)
  {
  char *s="Golden Global View";
  printf("%s has %d chars",s,strlen(s));
  getchar();
  return 0;
  }

与sizeof()的区别

strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止。

  char aa[10];cout<<strlen(aa)<<endl; //结果是不定的
  char aa[10]={'\0'}; cout<<strlen(aa)<<endl; //结果为0
  char aa[10]="jun"; cout<<strlen(aa)<<endl; //结果为3
  而sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen是函数。
  sizeof(aa) 返回10
  int a[10]; sizeof(a) 返回40
  1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
  该类型保证能容纳实现所建立的最大对象的字节大小。
  2.sizeof是操作符(关键字),strlen是函数。
  3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
  sizeof还可以用函数做参数,比如:
  short f();
  printf("%d\n", sizeof(f()));
  输出的结果是sizeof(short),即2。
  4.数组做sizeof的参数不退化,传递给strlen就退化为 指针了。
  5.大部分编译程序 在编译的时候就把sizeof计算过了是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因
  char str[20]="0123456789";
  int a=strlen(str); //a=10;
  int b=sizeof(str); //而b=20;
   6.strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。
  7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
  8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小,
  当适用一静态地空间数组, sizeof 归还全部数组的尺寸。
  sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
  9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,
  如:
  fun(char [8])
  fun(char [])
  都等价于 fun(char *)
  在C++里参数传递数组永远都是传递指向数组首元素的指针, 编译器不知道数组的大小
  如果想在函数内知道数组的大小, 需要这样做:
  进入函数后用memcpy拷贝出来,长度由另一个形参传进去
  fun(unsiged char *p1, int len)
  {
  unsigned char* buf = new unsigned char[len+1]
  memcpy(buf, p1, len);
  }
  我们能常在用到 sizeof 和 strlen 的时候,通常是计算字符串数组的长度
  看了上面的详细解释,发现两者的使用还是有区别的,从这个例子可以看得很清楚:
  char str[20]="0123456789";
  int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
  int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。
  上面是对 静态数组处理的结果,如果是对指针,结果就不一样了
  char* ss = "0123456789";
  sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是
  长整型的,所以是4
  sizeof(*ss) 结果 1 ===》*ss是第一个字符 其实就是获得了字符串的第一位'0' 所占的内存空间,是char类
  型的,占了 1 位
  strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen
  sizeof返回对象所占用的字节大小. //正确
  strlen返回字符个数. //正确
  在使用sizeof时,有一个很特别的情况,就是数组名到指针蜕变,
  char Array[3] = {'0'};
  sizeof(Array) == 3;
  char *p = Array;
  strlen(p) == 1;//sizeof(p)结果为4
  在传递一个数组名到一个函数中时,它会完全退化为一个指针
  ----------------------------------------------------------
  看完以上你是否很清楚sizeof和strlen的区别了呢?还不明白的话,我们看下面几个例子:
  第一个例子
  char* ss = "0123456789";
  sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针
  sizeof(*ss) 结果 1 ===》*ss是第一个字符
  大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度
  这就是sizeof(x)可以用来定义数组维数的原因
  char str[20]="0123456789";
  int a=strlen(str); //a=10;
  int b=sizeof(str); //而b=20;
  大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度
  这就是sizeof(x)可以用来定义数组维数的原因
  char str[20]="0123456789";
  int a=strlen(str); //a=10;
  int b=sizeof(str); //而b=20;
  char ss[] = "0123456789";
  sizeof(ss) 结果 11 ===》ss是数组,计算到\0位置,因此是10+1
  sizeof(*ss) 结果 1 ===》*ss是第一个字符
  char ss[100] = "0123456789";
  sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1
  strlen(ss) 结果是10 ===》strlen是个函数内部实现是用一个循环计算到\0为止之前
  int ss[100] = "0123456789";
  sizeof(ss) 结果 400 ===》ss表示再内存中的大小 100×4
  strlen(ss) 错误 ===》strlen的参数只能是char* 且必须是以'\0'结尾的
  char q[]="abc";
  char p[]="a\n";
  sizeof(q),sizeof(p),strlen(q),strlen(p);
  结果是 4 3 3 2
  第二个例子
  class X
  {
  int i;
  int j;
  char k;
  };
  X x;
  cout<<sizeof(X)<<endl; 结果 12 ===》内存补齐
  cout<<sizeof(x)<<endl; 结果 12 同上
  第三个例第一个例子
  char* ss = "0123456789";
  sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针
  sizeof(*ss) 结果 1 ===》*ss是第一个字符
  char ss[] = "0123456789";
  sizeof(ss) 结果 11 ===》ss是数组,计算到\0位置,因此是10+1
  sizeof(*ss) 结果 1 ===》*ss是第一个字符
  char ss[100] = "0123456789";
  sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1
  strlen(ss) 结果是10 ===》strlen是个函数内部实现是用一个循环计算到\0为止之前
  int ss[100] = "0123456789";
  sizeof(ss) 结果 400 ===》ss表示再内存中的大小 100×4
  strlen(ss) 错误 ===》strlen的参数只能是char* 且必须是以'\0'结尾的
  char q[]="abc";
  char p[]="a\n";
  sizeof(q),sizeof(p),strlen(q),strlen(p);
  结果是 4 3 3 2
  第二个例子
  class X
  {
  int i;
  int j;
  char k;
  };
  X x;
  cout<<sizeof(X)<<endl; 结果 12 ===》内存补齐
  cout<<sizeof(x)<<endl; 结果 12 同上
  第三个例子
  char szPath[MAX_PATH]
  如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小)
  子
  char szPath[MAX_PATH]
  如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小)
  还有一位网友的说明也很好:
  其实理解 sizeof 只需要抓住一个要点:栈
  程序存储分布有三个区域:栈、静态和动态。能够从代码直接操作的对象,包括任何类型的变量、指针,都是在栈上的;动态和静态存储区是靠栈上的指所有针间接操作的。 sizeof 操作符,计算的是对象在栈上的投影体积;记住这个就很多东西都很清楚了。
  char const * static_string = "Hello";
  sizeof(static_string) 是 sizeof 一个指针,所以在 32bit system 是 4
  char stack_string[] = "Hello";
  sizeof(stack_string) 是 sizeof 一个数组,所以是 6 * sizeof(char)
  char * string = new char[6];
  strncpy(string, "Hello", 6");
  sizeof(string) 是 sizeof 一个指针,所以还是 4。和第一个不同的是,这个指针指向了动态存储区而不是静态存储区。
  不管指针指向的内容在什么地方,sizeof 得到的都是指针的栈大小
  C++ 中对引用的处理比较特殊;sizeof 一个引用得到的结果是 sizeof 一个被引用的对象的大小;所以
  struct O
  {
  int a, b, c, d, e, f, g, h;
  };
  int main()
  {
  O & r = *new O;
  cout << sizeof(O) << endl; // 32
  cout << sizeof r << endl; // 也是 32
  system("PAUSE");
  }
  r 引用的是整个的 O 对象而不是指向 O 的指针,所以 sizeof r 的结果和 sizeof O 完全相同。

编辑本段自定义函数实现strlen()函数的功能

  下面几种实现strlen函数的 源代码大家参考
  -------------------------------------------------1:start------------------------------------
  #include <stdio.h>
  #include <assert.h>
  typedef unsigned int u_int;
  u_int Mystrlen(const char *str)
  {
  u_int i;
  assert(str != NULL);
  for (i = 0; str[i]!= '\0'; i++);
  return i;
  }
  ------------------------------------------------1:end--------------------------------------
  -------------------------------------------------2:start--------------------------------------
  int strlen(const char *str)
  {
  assert(str != NULL);
  int len = 0;
  while((*str++) != '\0')
  len++;
  return len;
  }
  ------------------------------------------------2:end ------------------------------------------
  ------------------------------------------------3:start------------------------------------------
  int strlen(const char *str)
  {
  assert(str);
  const char *p = str;
  while(*p++!=NULL);
  return p - str - 1;
  }
  -------------------------------------------------3:end-----------------------------------------
  -------------------------------------------------4:start----------------------------------------
  int strlen(const char *str)
  {
  assert(str);
  if (*str==NULL)
  return 0;
  else
  return (1 + strlen(++str));
  }
  -----------------------------------------------4:end----------------------------------------
  以上各种实现的方式都是大同小异的,有的用的是变量,有的用的是指针。
  其中,最后一个用的是递归的方式。其实,在实现库函数的时候,是规定不可以
  调用其他的库函数的,这里只是给大家一个方法,不用变量就可以实现strlen。

微信小程序数据采集实战:抓包+接口分析+动态数据全流程 微信小程序爬虫虽然比普通网页爬虫复杂,但只要掌握了正确的方法,其实并没有想象中那么难。核心思路就是:先绕过证书校验抓包,然后反编译小程序找到加密逻辑,最后用Python模拟相同的加密和解密过程。需要特别提醒的是,本文仅供技术研究使用。请遵守《网络安全法》和相关法律法规,不要爬取他人的敏感数据,不要将爬虫技术用于非法用途。尊重他人的知识产权和数据安全,才能让技术发挥真正的价值。 阅读详情

相关推荐

OpenCASCADE(OCC)读取 STEP 模型文件并在MFC中显示

OpenCASCADE(OCC)读取 STEP 模型文件并在MFC中显示

weixin_61900468的博客 1万+

字符函数、字符串函数和内存函数

介绍:1.计算字符串长度的函数,字符串以‘\0’作为结束标志,strlen函数返回的是在字符串‘\0’前面出现的字符个数,不包含 ‘\0’2.参数指向的字符串必须要以 ‘\0’结束3.函数的返回值为size_t,是无符号的使用范例: 一.长度不受限制的字符串函数(传参时无需传入字符串长度) 1.strcpy()函数 char* strcpy(char* destination, const char* source)介绍:1.拷贝字符串的函数,会将源字符串从目标空间的起始位置开始拷贝,这意味着如

Masquerena114514的博客 586

CloudCompare点云变换保姆级教程:从平移、旋转到绕任意点旋转,一次搞定

本文提供CloudCompare点云变换的全面教程,涵盖从基础平移、旋转到绕任意点旋转的高级技巧。通过详细的操作步骤和实战案例,帮助用户掌握点云数据处理的核心技能,提升三维模型对齐和变换的效率与精度。

weixin_28717969的博客 291

stlen和sizeof的区别

sizeof: 1、用于数据类型  sizeof使用形式:sizeof(type),数据类型必须用括号括住。如sizeof(int)。 2、用于变量 sizeof使用形式:sizeof(var_name)或sizeof var_name strlen用法: 原型:extern unsigned int strlen(char *s);,在Visual C++

驴行天下 1642

Windows环境下DataEase一站式安装指南(含WSL2+Docker配置)

本文详细介绍了在Windows环境下通过WSL2和Docker快速部署DataEase的完整教程。从WSL2配置、Docker环境搭建到DataEase离线安装,逐步指导用户完成一站式部署,特别适合需要快速搭建数据分析平台的开发者。教程包含常见问题解决方案和性能优化技巧,帮助用户高效使用这款国产开源数据可视化工具。

weixin_42526166的博客 398

AI产品经理必备:Agent评测维度、指标与工程化落地指南

随着大模型从单轮问答走向复杂的Agent应用,如何科学地评测一个Agent是否真正“办成了事”,成为AI产品经理必须掌握的核心能力。与传统大模型评测关注回答质量不同,Agent评测需要综合评估任务规划、工具调用、多轮对话一致性以及失败自愈等行为。任务完成率与工具调用成功率是最关键的两个量化指标,同时还需关注延迟与Token成本等工程约束。在实际落地中,评测集的设计要覆盖业务主流程与边界场景,并通过批量回归测试与版本对比,为产品选型、算法迭代和上线决策提供数据支持。本文系统拆解了Agent评测的完整流程,帮助

weixin_29057163的博客 344

【C语言】常用的字符串函数使用 && 模拟实现

在使用下面介绍的库函数时声明以下头文件。

ZhuGeBin26的博客 713

【网络】PFC背景和原理 、文档(DCB=PFC + ETS,DCBX=DCB扩展)

目录 零、背景 一、PFC 1.概述 2.报文格式 3.工作机制 二、ETS 产生原因 基本原理 优先级组的调度 优先级的调度 三、DCBX 产生原因 基本原理 DCBX TLV介绍 五、PFC 拥塞研究(文档收集) 六、DC-QCN算法 (网络工程师必会) 7.1 α更新 7.2 降速 7.3 提速 8.总结 ...

小鱼菜鸟的博客 2165

strlen 与 size of

strlen 求助编辑百科名片 strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。 目

http://www.softwareace.cn 王牌软件 642

Duplicate Cleaner Pro 5.16 保姆级教程:如何用哈希值精准清理重复文件(附音频/视频模式详解)

本文详细介绍了Duplicate Cleaner Pro 5.16如何利用哈希值技术精准清理重复文件,特别针对音频、视频和图片等多媒体文件提供了专业解决方案。通过哈希算法比对和多媒体特征识别,帮助用户高效管理存储空间,提升文件整理效率。

weixin_27032989的博客 566

深入大模型-13-大模型Skills应用之标准目录结构和开发一个Skill的步骤

首先对比Prompt工程,上下文工程,Skills工程,MCP工具的概念与区别,然后介绍Skill的标准目录结构,同时描述了开发一个Skill的步骤和最佳实践。

qq_20466211的博客 748

在使用stlen()函数时遇到的运行异常问题

今天写了一个KMP算法,但是在使用strlen()函数获取字符串长度时,发现程序和预期不对,无论怎样调试结果依旧如此。因此我就找到了strlen()函数的定义,如下代码: size_t __cdecl strlen( _In_z_ char const* _Str ); 可以看出来函数返回为size_t类型,再来看看他在C语言中的定义,为unsigned int类型,无符...

shitou123xsx的博客 397

西门子S7-1200PLC控制步进电机的组态编程和具体步骤

西门子S7-1200PLC控制步进电机的组态编程和具体步骤 硬件准备: 1) 一个S7-1214C DC/DC/DC,订货号:6ES7 214-1AG40-0XB0 2) 一个86系的步进电机+相应的驱动器 3) 一个20A的西门子24V电源(步进驱动器及plc电源) 4) Portal V15版本 组态及编程: 1) 创建一个验证项目,添加cpu( S7-1214C),双击“工艺对象”,选择“运动控制”的TO_PositioningAxis V6.0版本,如下图所示: 2) “确定”后,系统自动生成名

Robot_PLC_HMI_Automation 1万+

sizeof和strlen的对比分析

本文对比了C语言中sizeof运算符和strlen函数的关键区别。sizeof是编译时运算符,用于计算变量或类型的内存大小(含空字符),适用于任意数据类型;strlen是运行时库函数,统计字符串中'\0'前的字符数(不含空字符),仅适用于字符串。主要差异体现在:sizeof计算数组时包含整个空间,而strlen只计有效字符;对指针使用sizeof得到指针大小,strlen则计算指向的字符串长度。正确理解二者的特性可避免内存和字符串处理错误,注意strlen要求字符串必须正确终止,否则会导致未定义行为。

祯的博客 1050

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

sizeof与strlen()函数的对比总结

strlen 是C语⾔库函数,功能是求字符串⻓度。统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。strlen 函数会⼀直向后找 \0 字符,直到找到为⽌,所以可能存在越界查找。

吴先生的博客 1069

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

sizeof 和strlen的对比

sizeof 和strlen的对比及数组和指针笔试题解析

我爱我想但不嫉妒 我哭我笑但不抱怨 我羞我愧但不悲叹 我怒我恨但不自弃 1145

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

sizeof和strlen的对比

sizeof()函数是用来计算变量内存空间大小的函数,单位是字节。如果计算的是操作数类型的话,计算的就是类型创建的变量所占内存的大小。(sizeof()只关注内存大小,不在乎内存中存放的数据)。统计的是从strlen()函数的参数str中这个地址向后,'\0'之前的字符串个数。strlen()函数会一直向后找'\0'字符,直到找到为止,所以可能存在越界访问。3.关注内存中是否有'\0',如果没有就会继续向后寻找,可能会存在越界。2.srtlen是求字符串长度的,统计的是'\0'之前的字符个数。

Ripple12312的博客 302

sizeof与strlen对比

本文是小编巩固自身而作,如有错误,欢迎指出!

2401_85487070的博客 945

【C语言】指针进阶之sizeof和strlen函数的对比

学习C语言sizeof与strlen函数的基本内容与使用以及区分它们

Renswc的博客 1592

sizeof总结并于strlen对比~

sizeof总结并于strlen对比 一、sizeof总结 在C/C++中,sizeof是一个判断数据类型或者表达式长度的运算符。其作用好像类似于strlen()函数,但是两者还是有所不同。 The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type(includin...

Zhang_1218的博客 570

深入理解指针(4)——sizeof和strlen的对比

sizeof 计算变量所占内存内存空间⼤⼩的,单位是字节,如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的⼤⼩。统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。3. 关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界。2. srtlen是求字符串⻓度的,统计的是 \0 之前字符的隔个数。sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据。2. sizeof计算操作数所占内存的⼤⼩,单位是字节。

weixin_65244731的博客 430

sizeof 和 strlen 的对比

本篇文章主要围绕着sizeof和strlen展开叙述,主要目标是了解这两个的用法,注意事项,以及辨析两者间的区别。

Alenenen的博客 843

strlen与sizeof对比

括号中有表达式时,表达式不参与计算,因为表达式在运行时才会计算,而sizeof()是在编译时就进行计算。的字符个数,遇到'\0'就停止。使用时需要包含库文件<string.h>。,它只在乎存放数据占用内存的大小,不在乎内容。,它是用来求字符串长度的。1、sizeof是一个。

2302_80962045的博客 137

学习字符函数strlen&模拟实现strlen,strlen和sizeof的对比

函数参数是字符串/数组的首元素的地址,被const修饰意味着不能通过(*str)解引用指针修改所传入的字符串的具体元素。第二个3是3个字节arr1中只有3个char类型的元素,一个char类型占1个字节。4是4个字节的意思,其中3个字节arr1中只有3个char类型的元素(abc),还有一个字节是\0。注意:strlen函数返的是字符串结束标志:“\0”,之前的字符的个数;如果没有所定义的字符串没有结束标志,那么strlen一直寻找,直到找到字符串结束标志:“\0”,为止。(可能会越界访问)(情况1,2)

努力学习C、C++、Linux等! 1188
上一篇: C语言遍历目录
下一篇: 换行符‘\n’和回车符‘\r’
DVStream
博客等级 码龄15年 50粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值