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分别是什么,到底有什么 ...
随机推荐
- 项目实战4—HAProxy实现高级负载均衡实战和ACL控制
haproxy实现高级负载均衡实战 环境:随着公司业务的发展,公司负载均衡服务已经实现四层负载均衡,但业务的复杂程度提升,公司要求把mobile手机站点作为单独的服务提供,不在和pc站点一起提供服务 ...
- 消息中间件RabbitMQ(一)
1.消息中间件 消息队列中间件是指利用高效可靠地消息传递机制传递消息.有两种传递模式:点对点模式.发布/订阅模式.流行的消息中间件有RabblitMQ.Kafka.RockerMQ.它们都提供了基于存 ...
- 使用Asp.Net Core MVC 开发项目实践[第四篇:基于EF Core的扩展2]
上篇我们说到了基于EFCore的基础扩展,这篇我们讲解下基于实体结合拉姆达表达式的自定义更新以及删除数据. 先说下原理:其实通过实体以及拉姆达表达式生成SQL语句去执行 第一种更新扩展: 自定义更新字 ...
- 翻译:man getopt(1)中文手册
NAME getopt - 解析命令行选项(加强版) SYNOPSIS getopt optstring parameters getopt [options] [--] optstring para ...
- Apollo 10 — adminService 全量发布
目录 UI 界面 Portal 服务 admin 服务 总结 1. UI 界面 2. Portal 服务 当我们点击上面的发布按钮的时候,调用的当然是 portal 的接口.具体代码如下: /** * ...
- Font Awesome 供更精准的图标搜索
https://www.thinkcmf.com/font/font_awesome/icon/address-book
- 关于"Could not find acceptable representation"错误
在项目中调用一个第三方服务,第三方服务是用Spring Boot写成的.结果调用时返回"Could not find acceptable representation"错误. 经 ...
- 设计模式—模板方法的C++实现
这是Bwar在2009年写的设计模式C++实现,代码均可编译可运行,一直存在自己的电脑里,曾经在团队技术分享中分享过,现搬到线上来. 1. 模板方法简述 1.1 目的 定义一个操作中的算法骨架,而将一 ...
- jquery中找到元素在数组中位置,添加或者删除元素的新方法
一:查找元素在数组中的位置 jQuery.inArray()函数用于在数组中搜索指定的值,并返回其索引值.如果数组中不存在该值,则返回 -1. jQuery.inArray( value, array ...
- Markdown简单上手
标题 # +内容 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 字体 1. 加粗(Ctrl+B) **加粗** 2. 斜体(Ctrl+I) *斜体* 3. 斜体加粗(Ctrl+B+I) ...