c strlen和sizeof详解
用双引号定义并且声明的时候明确指定数组大小的话,sizeof就会返回指定的大小,不会自动加1;
char str2[10] = "hello c";
printf("strlen = %ld\n", strlen(str2));
printf("sizeof = %ld\n", sizeof(str2));
//strlen = 7
//sizeof = 10
用大括号定义并且声明的时候明确指定数组大小的话,sizeof就会返回指定的大小,不会自动加1;
char str5[10] = {'h','e','l','l','o',' ','C'};
printf("strlen = %ld\n", strlen(str5));
printf("sizeof = %ld\n", sizeof(str5));
//strlen = 7
//sizeof = 10
用双引号定义并且声明的时候没有明确指定数组大小的话,sizeof就会是实际的大小+1;strlen也正常
char str1[] = "hello c";
printf("strlen = %ld\n", strlen(str1));
printf("sizeof = %ld\n", sizeof(str1));
//strlen = 7
//sizeof = 8
用大括号定义并且声明的时候没有明确指定数组大小的话,sizeof就会是实际的大小(不加1);但是strlen就变得诡异了,而且每次执行的结果的不一样
char str4[] = {'h','e','l','l','o',' ','C'};
printf("strlen = %ld\n", strlen(str4));
printf("sizeof = %ld\n", sizeof(str4));
//strlen = 14
//sizeof = 7
用双引号定义并且声明的时候明确指定数组大小,比实际的小的话,sizeof就会返回指定的大小,不会自动加1;但是strlen就变得诡异了,而且每次执行的结果的不一样
char str3[5] = "hello c";
printf("strlen = %ld\n", strlen(str3));
printf("sizeof = %ld\n", sizeof(str3));
//strlen = 12 strlen就变得诡异了,而且每次执行的结果的不一样
//sizeof = 5
char cr[] = {'a','b','\0','c',};
char cr1[] = {'a','b',0,'c',};
printf("cr strlen = %ld\n", strlen(cr));
printf("cr1 strlen = %ld\n", strlen(cr1));
printf("cr sizeof = %ld\n", sizeof(cr));
//cr strlen = 2
//cr1 strlen = 2
//cr sizeof = 4
通过以上的代码可以得出以下结论
- strlen的原理是一直计数,直到遇到'\0'为止
- 用双引号定义时,会在最后自动加上'\0'
- 用大括号定义时,不会在最后自动加上'\0'
- 用大括号定义时,如果声明的数量大于大括号里的数量,会在最后用'\0'填补缺失的位数
- '\0' = 0
全局变量存放在静态区,静态区的初始值都是'\0',所以strlen(str6)为0
char str6[10];
int main(){
printf("strlen = %ld\n", strlen(str6));
printf("sizeof = %ld\n", sizeof(str6));
}
//strlen = 0
//sizeof = 10
局部变量存放在栈区,栈区的初始值都是随机的,所以strlen(str6)为随机值
char str7[10];
printf("strlen = %ld\n", strlen(str7));
printf("sizeof = %ld\n", sizeof(str7));
//strlen = 12(随机值)
//sizeof = 10
以指针形式定义的话,sizeof返回的永远是指针的大小
char *p = "hello C";
printf("strlen = %ld\n", strlen(p));
printf("sizeof = %ld\n", sizeof(p));
//strlen = 7
//sizeof = 8
char *p1[3] = {"hello C","abcd","12345"};
printf("p1 strlen = %ld\n", strlen(*p1));//7
printf("p1 strlen = %ld\n", strlen(*(p1+1)));//4
printf("p1 strlen = %ld\n", strlen(*(p1+2)));//5
printf("p1 sizeof = %ld\n", sizeof(p1));//24 因为p1不是指针,p1是指针数组,数组里有3个指针所以3 * 8 = 24
char (*p2)[3000];
printf("p2 sizeof = %ld\n", sizeof(p2));//8 因为p2是数组指针,所以不管数组大小是多少,值都是8
函数的参数是数组时,有个经典的骗局,虽然fun函数的参数是数组,但是c语言不会在复制一个数组给形参,它会实际传递的是数组的首地址。
#include <stdio.h>
#include <string.h>
void fun(char str[]){//等同于void fun(char* str),所以sizeof(str)的值为8
printf("strlen = %ld\n", strlen(str));
printf("sizeof = %ld\n", sizeof(str));
}
int main(){
char str[10] = "Hello C";
printf("strlen = %ld\n", strlen(str));
printf("sizeof = %ld\n", sizeof(str));
printf("-------------------------------------\n");
fun(str);
}
执行结果:
strlen = 7
sizeof = 10
-------------------------------------
strlen = 7
sizeof = 8
c strlen和sizeof详解的更多相关文章
- (转载) Linux IO模式及 select、poll、epoll详解
注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案 ...
- Linux C 字符串函数 sprintf()、snprintf() 详解
一.sprintf() 函数详解 在将各种类 型的数据构造成字符串时,sprintf 的强大功能很少会让你失望. 由于 sprintf 跟 printf 在用法上几乎一样,只是打印的目的地不同而已,前 ...
- trie字典树详解及应用
原文链接 http://www.cnblogs.com/freewater/archive/2012/09/11/2680480.html Trie树详解及其应用 一.知识简介 ...
- memset函数详解
语言中memset函数详解(2011-11-16 21:11:02)转载▼标签: 杂谈 分类: 工具相关 功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大 ...
- C++调用JAVA方法详解
C++调用JAVA方法详解 博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...
- Linux 网络编程三(socket代码详解)
//网络编程客户端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include < ...
- web_custom_request函数详解
在LR中当使用HTML录制方式时,录制的脚本中主要由函数web_link().web_submit_form().web_url().web_submit_data()组成,当使用HTTP录制方式时, ...
- 使用 /proc 文件系统来访问 linux操作系统 内核的内容 && 虚拟文件系统vfs及proc详解
http://blog.163.com/he_junwei/blog/static/19793764620152743325659/ http://www.01yun.com/other/201304 ...
- (转)Linux IO模式及 select、poll、epoll详解
本文为转载,并作了部门调整.修改. [原文出处:https://segmentfault.com/a/1190000003063859] 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么 ...
随机推荐
- 解决Linux下Jexus验证码无法显示
1:安装mono相关字体 yum install -y dejavu-fonts-common dejavu-lgc-sans-mono-fonts 2:重启jexus /usr/jexus/jws ...
- 使用Eclipse创建SpringBoot项目
1 首先我们需要安装STS插件:Help--> Eclipse Marketplace 安装成功之后,会让你重启eclipse. 2 然后 File-->New--->Proje ...
- SpringBoot系列——花里胡哨的banner.txt
前言 我们注意到springboot项目启动时,控制台会打印自带的banner,然后对于部分IT骚年来说,太单调太普通太一般了:所以,是时候表演真正的技术了 项目结构 我们只需要在springboot ...
- shell编程基础(四): shell脚本语法之函数及调试
一.Shell脚本中的函数 和C语言类似,Shell中也有函数的概念,但是函数定义中没有返回值也没有参数列表.例如: #! /bin/sh fun(){ echo "Function fun ...
- Spark学习(一)
一.启动Spark 1.standalone模式 方法一: (1)启动主节点 ./sbin/start-master.sh 访问http://127.0.0.1:8080,得到如下页面 注意标记到的链 ...
- Docker在Linux上运行NetCore系列(五)更新应用程序
转发请注明此文章作者与路径,请尊重原著,违者必究. 本篇文章与其它系列文章不同,为了方便测试,新建了一个ASP.Net Core视图应用. 备注:下面说的应用,只是在容器中运行的应用程序. 查看现在运 ...
- WebApi HTTP Put 405 Method not allowed
总结列表: 1. There is already an open DataReader associated with this Connection which must be closed fi ...
- Hibernate的应用
//首先获得SessionFactory的对象 SessionFactory sessionFactory = new Configuration().configure().buildSession ...
- codeM美团编程大赛初赛B轮D题(考验你的数学思维!)
[编程题] 模 时间限制:1秒空间限制:32768K 给定四个正整数a,b,c,k,回答是否存在一个正整数n,使得a*n在k进制表示下的各位的数值之和模b为c.输入描述:第一行一个整数T(T < ...
- Netty实战十一之预置的ChannelHandler和编解码器
Netty为许多通用协议提供了编解码器和处理器,几乎可以开箱即用,这减少了你在那些相当繁琐的事务上本来会花费的时间与精力.我们将探讨这些工具以及它们所带来的好处,其中包括Netty对于SSL/TLS和 ...