关于sizeof、strlen的理解与辨析以及strlen的模拟实现
关于sizeof、strlen的理解与辨析以及strlen的模拟实现
1. sizeof()
sizeof的作用: 计算变量所占内存内存空间大小,单位是字节。
注意事项:
① 首先要明确的一点是:sizeof不是函数,而是操作符。
② 如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。
③ sizeof 只关注占用内存空间的大小,不在乎内存中存放什么数据。
④ 操作数是变量时,括号可以省略。(这也变相证明了sizeof不是函数)
⑤ 操作数是表达式时,表达式不计算。
关于表达式不计算的问题,有必要作一定说明。
sizeof 在代码进行编译时,就已根据表达式的类型确定了值的大小,而表达式的执行却要在程序运行期间才能执行,在编译期间已经将sizeof处理掉了,所以在运行期间表达式不会再执行。
2. strlen
其函数原型:size_t strlen ( const char * str ) ;
注意事项
① 统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数(并不包括\0)
② strlen 函数会⼀直向后找 \0 字符,直到找到为⽌,所以可能存在越界查找
//如下代码就会发生越界查找(因为arr1之前与之后空间是未知的)
#include <stdio.h>
int main()
{
char arr1[3] = {'a', 'b', 'c'}; printf("%d\n", strlen(arr1)); return 0;
}
③strlen是库函数,使用需要包含头文件# include< string.h>
④strlen的返回类型是无符号整型。
⑤strlen的参数类型是char *的指针,即是一个地址。
2.1关于strlen的模拟实现(主函数不再赘述)
//计数器⽅式
int my_strlen(const char * str)
{
int count = 0;
assert(str);
while(*str)
{
count++;
str++;
}
return count;
}
//递归方式
int my_strlen(const char * str)
{
assert(str);
if(*str == '\0')
return 0;
else
return 1+my_strlen(str+1);
}
//指针-指针的⽅式
int my_strlen(char *s)
{
assert(str);
char *p = s;
while(*p != ‘\0’ )
p++;
return p-s;
}
3.关于sizeof与strlen的区别
| sizeof | strlen |
|---|---|
| 1. sizeof是操作符 | 1. strlen是库函数,使⽤需要包含头⽂件 string.h |
| 2. sizeof计算操作数所占内存的大小, 单位是字节。 | 2. srtlen是求字符串长度的,统计的是 \0 之前字符的个数。 |
关于sizeof、strlen的理解与辨析以及strlen的模拟实现的更多相关文章
- strlen、strcmp、strcat、strlen、memmove
#include <cassert> #include <iostream> using namespace std; /* strlen 返回字符串不包含结束符\0的长度 * ...
- C语言中sizeof、strlen函数的部分理解
一.测试环境 Win10 + Visual Studio 2017 二.测试代码 #include "pch.h" #include <iostream> #inclu ...
- 字符串赋值方式理解 sizeof 和strlen的一些区别
#include<stdio.h>#include<string.h> int main(){ int a,i=0; char ch[10000]; while(scanf( ...
- C语言-sizeof()与strlen()的区别【转】
先看看sizeof() 一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出了其操作数的存储大小.操作数可以是 ...
- Strlen()与sizeof()
在学习C语言时以及面试中,经常会见到strlen()与sizeof()这一对容易混淆的概念,搞清楚这两个概念,往往考察了编程人员对语言的基本掌握能力. 首先大家先明确两个概念是: 1.strlen() ...
- 【C++基础】sizeof 与 strlen的区别
要理解两者的区别,就要分别理解他们的本质 strlen(char *) 计算字符串的长度,内部实现是用一个循环计算字符串的长度,直到‘\0’为止 1.srtlen 是一个函数,参数只能为char 或者 ...
- sizeof和strlen小结
sizeof和strlen小结 写在前面 之所以要总结一下sizeof和strlen的用法和区别,是因为这些知识可以帮助我们更加深入的理解各种数据结构在内存中的占用情况,也许表面上看好像没有多大用处, ...
- sizeof求字节以及与strlen的区别
例子一: /* *根据以下条件进行计算: *1. 结构体的大小等于结构体内最大成员大小的整数倍 *2. 结构体内的成员的首地址相对于结构体首地址的偏移量是其类型大小的整数倍,比如说double型成员相 ...
- 【转载】strlen与sizeof区别
自己小结: sizeof使用时,若是数组变量,则是数组变量占的大小 char a[10]; sizeof(a)=10 若是指针,则为指针大小,数组变量作为函数参数传递时,会退化成指针,且函数内是不知道 ...
- 有关 sizeof和strlen的总结
先看看sizeof() 一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出了其操作数的存储大小.操作数可以是 ...
随机推荐
- this 之谜揭底:从浅入深理解 JavaScript 中的 this 关键字(二)
前言 系列首发于公众号『前端进阶圈』 ,若不想错过更多精彩内容,请"星标"一下,敬请关注公众号最新消息. this 之谜揭底:从浅入深理解 JavaScript 中的 this 关 ...
- Linux内存占用分析的几个方法,你知道几个?
0. 引言: 系统内存是硬件系统中必不可少的部分,定时查看系统内存资源运行情况,可以帮助我们及时发现内存资源是否存在异常占用,确保业务的稳定运行. 例如:定期查看公司的网站服务器内存使用情况,可以确保 ...
- [VS Code扩展]写一个代码片段管理插件(二):功能实现
@ 目录 创建和插入代码片段 代码片段列表 代码片段预览 代码片段编辑 自定义映射 默认映射 自动完成 项目地址 创建和插入代码片段 VS Code扩展提供了数据存储,其中globalState是使用 ...
- zabbix报错大全
zabbix报错 https://www.cnblogs.com/losbyday/category/876878.html作者总结的很全棒 1.在启动zabbix-agent 时系统日志输出 PID ...
- stm32学习之调试篇踩坑记录
如何下载fml文件 找不到64k的fml文件 could not stop cortex-m device:无法连接,我当时是在程序中的一些初始化函数中,有几条语句禁用了(JTAG+SW) 接线顺序, ...
- 关于java连接数据库时提示异常java.sql.SQLException: No suitable driver found for说明
当我们测试一个新的数据库服务时,需要使用对方提供jdbc驱动来连接数据库,有时候简单的写个demo去连接,发现提示异常: java.sql.SQLException: No suitable driv ...
- .NET 多版本兼容的精美 WinForm UI控件库
前言 有粉丝小伙伴在后台留言咨询有没有WinForm 控件库推荐,现在就给安排上. .NET 平台进行 Windows 应用程序开发的我们来说,找一个既美观又实用的 WinForm UI 控件库至关重 ...
- SPiT:超像素驱动的非规则ViT标记化,实现更真实的图像理解 | ECCV 2024
Vision Transformer(ViT) 架构传统上采用基于网格的方法进行标记化,而不考虑图像的语义内容.论文提出了一种模块化的超像素非规则标记化策略,该策略将标记化和特征提取解耦,与当前将两者 ...
- CSS – Clip Path
前言 我是在搞 1 side box-shadow 发现这个功能的. 平常很少做特效, 所以对这个好功能缺乏认识. 这篇大概记入一下先, 以后有认真用再补上细节. 参考 Youtube – Aweso ...
- ASP.NET Core – MVC vs Razor Page
前言 早年只有 MVC, Razor Page 是后来才出现的. 一开始其实我很看不起 Razor Page, MVC 能做的东西为什么要搞多一个 Razor Page 来做呢? 但我还是尝试用了起来 ...
