关于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;
- 关于strlen字符数组
- 关于字符数组,字符指针 strlen和sizeof总结
- 关于strlen 和 wstlen_s 操作未初始化的字符数组
- 字符数组中关于strlen的问题(未初始化)
- 关于strlen 计算未初始化的字符数组长度
- 字符数组,字符指针,sizeof,strlen总结
- 字符数组、字符指针;sizeof、strlen
- 字符数组,字符指针,sizeof,strlen总结
- 字符数组,字符指针,sizeof,strlen总结
- 字符数组,字符指针,sizeof,strlen总结
- 字符数组,字符指针,sizeof,strlen总结
- 补补基础知识,关于字符串,字符数组,CString型字符串,strlen,sizeof
- strlen,与字符数组,memcpy,strcmp,strncmp
- strlen和sizeof求字符数组长度
- 字符串,字符指针和字符数组的sizeof和strlen
- C、C++字符数组,字符指针,sizeof,strlen总结
- C++字符数组、字符指针、strlen、sizeof总结
- 关于数组,sizeof(),strlen的计算问题
- PHP 数据类型
- Python-memcached的基本使用(python 中使用memcached简单示例)
- WPF CodeBehind 草稿
- dentry_Ext4
- hdu 2303
- 关于strlen字符数组
- 结构体在C与C++中的异同
- Node 2478301 does not exist in the cache. It may have been deleted already.
- UNDO Retntion
- pthread_rwlock_t
- 在Ubuntu 13.04上安装Google Chrome只需三步
- Ubuntu下用命令行快速打开各类型文件
- J2EE 领域的一些技术框架结构图
- jsp生成四位数字的验证码