深入解析sizeof和strlen的区别与联系

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 深入解析sizeof和strlen的区别与联系

大家好,今天我们来探讨一下C语言中两个常用的函数sizeof和strlen。虽然它们都与字符串有关,但它们的用途和实现原理却大相径庭。下面我将从以下几个方面进行对比分析:

一、深度解析

1.sizeof

定义:

sizeof是一个操作符用于获取数据类型或变量在内存中所占的字节数。它是一个编译时运算符,其结果在编译时就已经确定。

参数类型:

sizeof可以接受两种参数:数据类型和变量。例如:

sizeof(int);    // 返回int类型所占的字节数
sizeof(a);      // 返回变量a所占的字节数

sizeof 计算变量所占内存内存空间⼤⼩,单位是字节,如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的⼤⼩。sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据。如果数组是字符串时,sizeof 计算数组大小时包括了结尾的空字符(‘\0’)。

返回值:

sizeof 返回的是数据类型或变量所占用的字节数,类型为 size_t(无符号整数类型)

2.strlen

定义:

strlen是一个函数,(所需的头文件为<string.h>)用于计算字符串的实际长度,不包括结尾的空字符(‘\0’)。它是在运行时进行计算,返回值为字符串的实际长度。

函数原型:

size_t strlen ( const char * str );

参数类型:

strlen的参数必须是一个以空字符(‘\0’)结尾的字符串。例如:

strlen("hello world");  // 返回11,不包括结尾的空字符

strlen统计的是从该函数的参数 str 中这个地址开始向后,\0 之前字符串中字符的个数。

strlen 函数会⼀直向后找 \0 字符,直到找到为⽌,所以可能存在越界查找。

返回值:

strlen 返回的是字符串中不包括结尾空字符(‘\0’)的字符数,类型也是 size_t(无符号整数类型)

二、对比

sizof与strlen对比

sizeof strlen
sizeof是操作符 strlen是库函数

sizeof计算操作数所占内存的⼤⼩,

单位是字节

strlen是求字符串⻓度的,统计的是 \0 之前字符的隔个数

不关注内存中存放什么数据

关注内存中是否有 \0 , 如果没有 \0 ,就会持续往后找,可能会越界

三、举例说明

#include <stdio.h>
#include <string.h>
int main() {
    char str[] = "Hello, World!";
    // sizeof 返回的是整个数组的大小,包括结尾的空字符和可能的额外空间
    size_t size_of_str = sizeof(str);
    // strlen 返回的是字符串中字符的数量,不包括结尾的空字符
    size_t length_of_str = strlen(str);
    printf("sizeof(str) = %zu\n", size_of_str);  // 通常会输出 13
    printf("strlen(str) = %zu\n", length_of_str);  // 输出 12
    return 0;
}

在这个例子中,sizeof(str) 的返回值是 13,因为 “Hello, World!” 加上一个空字符 \0 一共是 13 个字符(每个字符占用 1 个字节),而 strlen(str) 的返回值是 12,因为它只计算了 “Hello, World!” 中非空字符的数量。

总结

sizeof和strlen虽然都与字符串有关,但它们的用途和实现原理有很大差异。sizeof用于获取数据类型或变量在内存中所占的字节数,而strlen用于计算字符串的实际长度。在实际编程过程中,应根据具体需求选择合适的函数。希望大家通过本文的介绍,能更好地理解和使用这两个函数。


相关文章
|
28天前
|
监控 网络协议 算法
OSPFv2与OSPFv3的区别:全面解析与应用场景
OSPFv2与OSPFv3的区别:全面解析与应用场景
35 0
|
3月前
|
存储 运维 安全
SaaS多租户和单租户的区别解析
SaaS多租户的系统维护成本低,多租户系统在升级时,只需要更新一次,维护人员不需要对每个用户更新,节省了很大的运维成本,这对于所有客户都在做同样事情的系统来说是很有用的。
117 3
|
4月前
|
前端开发 UED 开发者
颠覆你的前端知识:防抖与节流的区别及实战解析!
【8月更文挑战第23天】在Web前端开发中,处理用户界面交互产生的事件可能会影响性能。为此,我们有两种优化方法:防抖(debounce)和节流(throttle)。防抖确保函数仅在事件停止触发一段时间后执行一次,适用于如搜索自动补全场景。而节流则确保函数按固定时间间隔执行,不管用户操作频率如何。本篇技术博客将深入解析两者差异并提供示例代码,帮助开发者更好地理解和应用这些技巧以提升应用性能和用户体验。
89 0
|
23天前
|
Java 编译器 API
深入解析:JDK与JVM的区别及联系
在Java开发和运行环境中,JDK(Java Development Kit)和JVM(Java Virtual Machine)是两个核心概念,它们在Java程序的开发、编译和运行过程中扮演着不同的角色。本文将深入解析JDK与JVM的区别及其内在联系,为Java开发者提供清晰的技术干货。
24 1
|
2月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
102 1
|
2月前
|
自动驾驶 5G 网络架构
|
2月前
|
Serverless 编译器 C语言
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
|
3月前
|
定位技术 网络虚拟化 数据中心
VLAN与VXLAN技术解析:仅一字之差的深远区别
通过深入了解VLAN与VXLAN的技术细节和应用场景,网络工程师可以根据具体需求选择最合适的技术来优化网络架构。对于现代网络环境,尤其是大规模和多变的网络结构,理解并合理运用这些技术是提高网络效率和安全性的关键。
101 1
|
3月前
|
存储 缓存 NoSQL
Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
82 0
|
3月前
|
弹性计算 开发框架 数据可视化
阿里云虚拟主机和云服务器有什么区别?多角度全解析对比
阿里云虚拟主机与云服务器ECS的主要区别在于权限与灵活性。虚拟主机简化了网站搭建流程,预装常用环境,适合初级用户快速建站;而云服务器提供全面控制权,支持多样化的应用场景,如APP后端、大数据处理等,更适合具备技术能力的用户。尽管虚拟主机在价格上通常更优惠,但随着云服务器价格的下降,其性价比已超越虚拟主机,成为更具吸引力的选择。

推荐镜像

更多
下一篇
DataWorks