C语言中sizeof与strlen的区别及使用注意

Felix
Felix
发布时间:2026-10-15| 6人浏览过
原创

在C语言编程中,准确理解内存管理与字符串处理至关重要。本文将详细解析sizeof运算符与strlen函数的本质区别,并结合具体代码示例,阐明它们在数组传递、指针大小以及不同操作系统位数下的行为差异,帮助开发者规避常见的内存访问陷阱。

准备条件:理解基础概念

在进行深入分析前,需明确两个核心概念的定义:

  • sizeof:这是一个C语言关键字/运算符,用于计算数据类型或变量所占用的内存字节数。它在编译阶段即可确定结果。
  • strlen:这是标准库提供的函数(string.h),用于计算字符串的实际字符长度。它统计直到遇到第一个空字符'\0'之前的字符数量,不包含'\0'本身。

实例演示:char数组的长度计算

考虑以下字符数组的定义:

char c[] = "abc\0cba";

在该声明中,编译器会在末尾自动添加结束符,因此内存布局包含:'a', 'b', 'c', '\0', 'c', 'b', 'a', '\0'。针对此数组,我们可以通过如下图片观察其运行结果:

基于上述内存模型,具体分析如下:

第1步:计算 sizeof(c) 的值

目的:获取变量分配的总内存大小。
结果:8。因为数组存储了7个显式定义的字符加上末尾的一个'\0',共占用8个字节。

第2步:计算 strlen(c) 的值

目的:获取有效的字符串长度。
结果:3。strlen从起始位置开始计数,遇到第一个'\0'即停止,因此只计算了前面的 a, b, c 三个字符。

第3步:操作风险提醒 - free(c)

警告:对上述静态定义在栈上的数组 c 执行 free(c) 是错误的操作。
后果:会导致段错误(Segmentation Fault)或程序崩溃。因为 malloc/calloc 分配的堆内存才需要释放,栈空间变量由编译器自动管理,手动释放属于非法内存访问。

进阶场景:short 数组与内存段结构

假设定义了短整型数组:short a[100]。

由于 short 类型通常占用 2 个字节,该数组总共占用 100 * 2 = 200 字节。因此,sizeof(a) 的结果为 200。

此外,若发生段错误,通常意味着程序试图访问不属于当前进程的内存区域。在传统内存模型中,程序被划分为代码段、数据段、堆栈段等,每段最大空间限制可能导致越界访问时触发保护机制。

核心难点:数组传参与指针大小差异

当数组作为参数传递给函数时,会发生“退化”现象,即数组名变为指向首元素的指针。

第4步:对比32位与64位系统的表现

编写测试代码如下:

void func(char *str)
{
    printf(" %d", sizeof(str));
    printf(" %d", strlen(str));
}
 
int main() 
{
    char a[] = "123456789";
    printf(" %d", sizeof(a)); // 打印局部数组大小
    printf(" %d", strlen(a)); // 打印局部数组长度
    func(a);                  // 传入数组,实为指针
    return 0;
}

在 32 位 Linux/Unix 系统中的输出结果:

10 9 4 9

在 64 位 Linux/Unix 系统中的输出结果:

差异解释:

  1. 局部数组:无论32位还是64位,sizeof(a) 都返回 10(9个字符 + 1个结束符),strlen(a) 都返回 9。
  2. 函数参数:在 func 内部,参数 str 是一个指针。
    • 32位系统中,内存地址宽 32 位,因此指针大小为 32/8 = 4 字节。
    • 64位系统中,内存地址宽 64 位,因此指针大小为 64/8 = 8 字节。

结论:指针的大小取决于系统架构,而与指针所指向的数据类型(如 char*, int*)无关。理解这一点是调试内存相关问题的关键。

总结:sizeof与strlen的本质区别

综合以上分析,两者的区别可以归纳为下表:

不同点

  • 类型归属:sizeof 是运算符;strlen 是库函数。
  • 参数对象:sizeof 作用于类型或变量;strlen 仅接受以 '\0' 结尾的字符串指针。
  • 计算时机:sizeof 通常在编译期确定(除非配合变长数组);strlen 必须在运行时遍历字符串才能得出结果。
  • 返回值意义:sizeof 表示占用的内存总量;strlen 表示有效字符的数量。

相同点

  • 它们都返回 size_t 类型的无符号整数。

以上就是关于C语言sizeof与strlen使用及区别的详细内容,更多关于C语言内存管理与字符串处理的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。