首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >透视C语言:sizeof与strlen的隐秘世界

透视C语言:sizeof与strlen的隐秘世界

作者头像
平凡之路.
发布2025-06-02 12:21:30
发布2025-06-02 12:21:30
12100
代码可运行
举报
文章被收录于专栏:学习学习
运行总次数:0
代码可运行

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

一、深度解析

1. sizeof

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

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

代码语言:javascript
代码运行次数:0
运行
复制
sizeof(int);    // 返回int类型所占的字节数
sizeof(a);      // 返回变量a所占的字节数

sizeof计算变量所占的内存空间大小,单位是字节。如果操作数是类型,计算的是使用该类型创建的变量所占内存空间的大小。需要注意的是,如果数组是字符串,sizeof在计算数组大小时会包括结尾的空字符(‘\0’)。

返回值: sizeof返回的是数据类型或变量所占用的字节数,类型为size_t(无符号整数类型)。这使得它在处理不同大小的数据时十分方便。

2. strlen

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

函数原型:

代码语言:javascript
代码运行次数:0
运行
复制
size_t strlen(const char *str);

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

代码语言:javascript
代码运行次数:0
运行
复制
strlen("hello world");  // 返回11,不包括结尾的空字符

strlen统计的是从参数str中这个地址开始,向后查找\0字符之前的字符个数。需要注意的是,strlen会一直向后查找\0,如果遇到未结束的字符串,会导致越界访问。

返回值: strlen返回的是字符串中不包括结尾空字符(‘\0’)的字符数,类型也是size_t(无符号整数类型)。这个特性使得strlen非常适用于字符串长度的计算。

二、对比

sizeof

strlen

sizeof是操作符

strlen是库函数

sizeof计算操作数所占内存的大小,单位是字节

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

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

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

三、举例说明

代码语言:javascript
代码运行次数: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!”中非空字符的数量。

总结

sizeofstrlen虽然都与字符串有关,但它们的用途和实现原理有很大差异。sizeof用于获取数据类型或变量在内存中所占的字节数,而strlen用于计算字符串的实际长度。在实际编程过程中,应根据具体需求选择合适的函数。理解这两个函数的区别,不仅能帮助我们编写更加高效的代码,还能避免一些潜在的错误。希望大家通过本文的介绍,能更好地理解和使用这两个函数。

功能

strlen

sizeof

定义

库函数,计算字符串长度(不包括\0)

关键字,计算类型或变量所占内存字节数

类型

函数

关键字/操作符

参数类型

char*,必须指向以\0结尾的字符串

变量、类型或表达式,适用于所有类型

返回值

size_t,字符串的实际字符数(不包括\0)

size_t,类型或变量所占的字节数

对字符串的处理

计算字符串的实际字符数,不包括末尾的\0

对于字符数组,计算整个数组所占的字节数,包括末尾的\0

对数组的处理

数组名作为参数时退化为指向数组首元素的指针,无法直接获取数组大小

数组名作为参数时不退化,直接返回整个数组所占的内存字节数

对指针的处理

指针指向的字符串长度(不包括\0),指针本身大小需用sizeof(指针类型)获取

返回指针本身所占的字节数,与指针指向的内容无关

使用场景

专门用于处理字符串,获取其长度

适用于所有类型,用于获取内存占用情况

注意事项

1. 字符串必须以\0结尾。 2. 返回值不包括字符串末尾的\0。

1. sizeof计算的是类型或变量所占的内存字节数,与变量的实际内容无关。 2. 对于结构体数组联合会有影响。 3. 数组作为sizeof的参数时,不退化为指针。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、深度解析
    • 1. sizeof
    • 2. strlen
  • 二、对比
  • 三、举例说明
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档