关于strlen字符数组

来源:互联网 发布:土地增值税的算法. 编辑:程序博客网 时间:2024/05/29 14:37
#include<stdio.h>#include<string.h>int main(){char s1[10] = {'m','o','b','i','l'};char s2[20] = {'a','s','n','i','\0','C','+','+'};char s3[6]  = {'i','s','o','n','+','+'};printf("%d\n",strlen(s1));printf("%d\n",strlen(s2));printf("%d\n",strlen(s3));return 0;}


输出:

5

4

12

 

解析:

s1初始化为10个字符空间,前5个字符已被初始化,后面5个字符会被自动赋值为0,也就是'\0',strlen函数会记录第一个'\0'前面的字符数,也就是5;

s2初始化为20个字符空间,strlen会记录第一个'\0'前面的字符数,也就是4;

s3初始化为6个字符空间,但这6个字符空间均已被赋值,没有给存放'\0'留有空间,所以strlen会在这6个字符空间之后继续寻找'\0',直到找到'\0',那12是怎么得到的呢?

首先在栈中,对数组的分配是以4个字节为分配粒度的(以4字节为单位数据对齐),即s1在实际的内存中分配了12(10+2)个字节,s2分配了20个字节,s3分配了8(6+2)个字节,由于strlen是根据'\0'来计算长度的,即依次从头开始向后搜索内存里的字节数,直到碰到某个字节的值是0为止,s1,s2,s3在栈里的结构是:s3s2s1所以搜完s3以后没碰到0继续向后即搜向s2,恰好s2里的第五个字节值是:0,所以计算出来的值就是:8+4=12.

如果改成如下,输出又是什么呢?

#include <stdio.h> #include <string.h> int main() { char s2[20] = {'b','a','s','n','i','\0','C','+','+'};char s1[] = {'m','o','b','i','l'}; char s3[6]  = {'i','s','o','n','+','+'}; printf("%d\n",strlen(s1)); printf("%d\n",strlen(s2)); printf("%d\n",strlen(s3)); return 0; }


输出:

13

5

21

s1会被初始化为5个字符,因为没有'\0',会继续向下寻找,因为栈中的结构:s3 s1 s2, 所以会在s2中寻找'\0',在s2的第6个字符找到'\0',而因为数据对齐,s1在内存中占8个空间,所以srelen(s1) = 8 + 5 = 13;

s2第6个字符是'\0', 所以strlen(s2) = 5;

s3中没有'\0',它会继续向下寻找,找到s1,发现s1中也没有'\0',继续向下寻找,找到s2,发现s2的第6个字符是'\0',而因为数据对齐,s3在内存中占8个字符空间,s1在内存中也占8个字符空间,所以strlen(s3) = 8 + 8 + 5 = 21;