关于strlen字符数组

#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;

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值