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
相关产品推荐
相关产品推荐

