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

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

在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 相关产品和应用

全部下载

专题列表