C语言中sizeof与strlen的区别及实战解析

青禾
青禾
发布时间:2026-10-13| 3人浏览过
原创

在C语言开发中,准确获取数据大小至关重要。初学者常混淆以字节为单位的 sizeof 运算符和以字符计数为目的的 strlen 函数。两者的根本差异在于对字符串结束标志 '\0' 的处理逻辑不同。

核心原理对比

1. sizeof 运算符

  • 计算单位: 以字节(Byte)为单位,返回变量或类型在内存中占据的实际空间大小。
  • '\0' 规则: 无论是求数组还是基本类型大小,均统计所有分配的空间。如果是字符数组,无论是否显式包含 '\0',sizeof 都会计算声明分配的总容量。
  • 特点: 编译期计算,结果固定。

2. strlen 函数

  • 计算单位: 返回字符串中的有效字符个数(不包含结束符)。
  • '\0' 规则: 它从传入指针开始向后扫描,一旦遇到 '\0' 便立即停止,且不将该终止符计入长度。
  • 特点: 运行期遍历,依赖正确的字符串终止标识。

常见误区与排错指南

当对一个未初始化为字符串的数组使用 strlen 时,如果数组内部没有显式的 '\0' 结束符,函数将持续向后内存扫描直至偶然遇到值为0的字节。这会导致以下风险:

  • 越界访问: 读取非预期内存区域。
  • 不可控结果: 返回值可能是随机值,也可能导致程序崩溃。

第1步:测试无 '\0' 结尾的字符数组

在此场景下,sizeof 仅返回定义的元素总数;而 strlen 因找不到结束符会持续越界读取。

#include <stdio.h>
#include <string.h>

int main()
{
	char s[] = { 'a', 'b', 'c' };
	printf("sizeof(s) = %zu\n", sizeof(s));
	// strlen 会一直往后找 \0,直到碰到为止
	printf("strlen(s) = %zu\n", strlen(s));
	return 0;
}

第2步:测试末尾带 '\0' 的字符数组

若手动在数组最后添加 '\0',strlen 将在第一个 '\0' 处停止,不再统计后续内容,此时二者表现符合常规认知。

#include <stdio.h>
#include <string.h>

int main()
{
	char s[] = { 'a', 'b', 'c', '\0' };
	printf("sizeof(s) = %zu\n", sizeof(s)); // 结果是 4
	printf("strlen(s) = %zu\n", strlen(s)); // 结果是 3
	return 0;
}

第3步:测试中间含有 '\0' 的字符数组

strlen 遇到中间的 '\0' 就会截断,只统计之前的部分;而 sizeof 依然统计整个数组定义的大小。

#include <stdio.h>
#include <string.h>

int main()
{
	char s[] = { 'a', 'b','\0','c' };
	printf("sizeof(s) = %zu\n", sizeof(s)); // 结果是 4
	printf("strlen(s) = %zu\n", strlen(s)); // 结果是 2
	return 0;
}

第4步:测试字符串字面量(隐式含 '\0')

C语言中的双引号字符串字面量默认会自动附加一个 '\0'。因此,即使代码中不写 '\0',底层也会分配该位置。

案例A:正常字符串

#include <stdio.h>
#include <string.h>

int main()
{
	// "abcd" 实际占用的内存是 'a','b','c','d','\0' 共5个字节
	printf("sizeof = %zu\n", sizeof("abcd")); 
	printf("strlen = %zu\n", strlen("abcd")); 
	return 0;
}

案例B:显式指定结束的字符串

如果在双引号内部明确写入 '\0',它会覆盖或截断原有的自动结束机制。

#include <stdio.h>
#include <string.h>

int main()
{
	// 显示写了 '\0',sizeof 统计全部字符+最后的\0
	printf("sizeof = %zu\n", sizeof("abd\0")); 
	// strlen 遇到第一个 \0 (即 d 后面那个) 就停了
	printf("strlen = %zu\n", strlen("abd\0")); 
	return 0;
}

案例C:字符串内部的 '\0' 截断效果

注意观察下面代码的差异:虽然 sizeof 参数略有不同,但重点在于 strlen 的行为。

#include <stdio.h>
#include <string.h>

int main()
{
	// 字符串内容为: a,b,c,\0,d
	// sizeof 统计这5个字符
	printf("sizeof = %zu\n", sizeof("abc\0d")); 
	// strlen 读到 c 后面的 \0 就结束了,忽略 d
	// 注意:原文演示代码中有两处打印不同字面量,此处演示关键原理
	printf("strlen = %zu\n", strlen("ab\0d")); 
	return 0;
}

总结

在使用 C 语言进行开发时,请务必区分“物理内存大小”与“逻辑字符串长度”。对于字符数组,若需作为字符串处理,必须确保末尾有正确的 '\0' 终止符,否则 strlen 将无法给出可靠结果。以上就是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 算法库。