You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中额外\0为何不影响strlen()返回的字符串长度?

关于C语言中strlen与字符串末尾额外\0的疑问解答

先看你给出的示例代码:

#include <stdio.h>
#include <string.h>
int main(int argc, char **argv){
    char str1[] = "dog";
    char str2[] = "dog\0";
    char str3[] = "dog\0\0";
    printf("%ld %ld %ld\n", strlen(str1), strlen(str2), strlen(str3));
    return 0;
}

运行后三个strlen()的返回值都是3,针对你的两个问题解答如下:

1. 为何额外的\0不会使strlen()返回的长度增加?

strlen()的工作逻辑很直接:从传入的字符串起始地址开始逐个计数,一旦遇到第一个\0(空字符)就立刻停止,返回的是这个\0之前的字符总数,且不包含这个终止用的\0。

你的三个字符串里,第一个\0都出现在"dog"的三个字符之后,不管后面跟多少个额外的\0,strlen()都不会继续往后统计,所以返回值都是3。

2. 若strlen()返回值相同,这三个字符串在内存中的实际大小是否也相同?

不相同,三个数组的内存大小有区别:

  • str1[] = "dog":编译器会自动在"dog"的三个字符后追加一个\0作为字符串终止符,数组总共有4个元素('d'、'o'、'g'、'\0'),内存大小为4字节。
  • str2[] = "dog\0":字符串字面量里已经包含了\0,编译器不会再额外添加,数组元素是'd'、'o'、'g'、'\0',内存大小也是4字节,和str1一致。
  • str3[] = "dog\0\0":字面量里包含两个\0,数组元素是'd'、'o'、'g'、'\0'、'\0',总共有5个元素,内存大小为5字节。

所以str1和str2的内存大小相同,但str3比前两者大1字节,三个字符串的实际内存大小并非完全一致。

内容的提问来源于stack exchange,提问作者Labeeb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 21:07:40