C语言中sizeof与strlen的区别及实战解析
在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语言基础的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













