C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别
字符数组的长度计算:必须以终止符’\0'作为边界,但对字符数组赋值时,有两种方式:
1:定义时用字符初始化
(1)char chs[7] = {'a', 'c', '0', 'z', '3','d'}; // 长度为6
上式等价于: (2)char chs[7] = {'a', 'c', '0', 'z', '3','d', '/0'}; // 长度为6
也等价于: (3)char chs[] = {'a', 'c', '0', 'z', '3','d', '/0' }; // 长度为6
但不等价于:
(4)char chs[] = {'a', 'c', '0', 'z', '3','d'}; // 长度未知,因为数组最后没有结束符'/0'
也不等价于:
(5)char chs[6] = {'a', 'c', '0', 'z', '3','d'}// 长度未知,因为数组最后没有结束符'/0'
其中 :(4)和(5)也是等价的,但不应该在实际应用中出现,因为没有结束符的数组长度未知,容易出现数组越界,致使访问非法内存,造成不可预料的程序错误。
因为字符数组是C 语言的概念,可见,C 语言语法中并未保证 :字符数组的结尾一定有结束符,这就需要程序员自己采取措施,以保证在数组的最后一个元素为 '/0' 。
2: 用字符串对数组进行初始化
在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串总是以'/0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符'/0'存入数组,并以此作为该字符串是否结束的标志。有了'/0'标志后,就不必再用字符数组的长度来判断字符串的长度了。
C语言允许用字符串的方式对数组作初始化赋值。
例如:
char c[]={'c', ' ','p','r','o','g','r','a','m'};
可写为:
char c[]={"C program"};
或去掉{}写为:
char c[]="C program";
用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志'/0'。上面的数组c在内存中的实际存放情况为:
C p r o g r a m /0
‘/0'是由C编译系统自动加上的。由于采用了‘/0'标志,所以在用字符串赋初值时一般无须指定数组的长度, 而由系统自行处理。
3. sizeof 和 strlen 的区别
strlen只能用char*做参数,且该char数组必须是以''/0''结尾的。
数组做sizeof的参数不退化,传递给strlen就退化为指针了。 详细说明可参见: 百度知道: strlen和sizeof有什么区别?
http://zhidao.baidu.com/question/12033577.html
注意:大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因 。
所以,sizeof 即使在字符数组没有终止符'/0' 的时候,也能够计算出数组“长度”的原因,但这里的“长度”实际上是:编译器分配给该数组变量的内存大小!
例如:char chs[] = {'a', 'c', '/0', 'z', '3','d'}; // sizeof(chs) = 6; 而strlen(chs) = 2.
C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别的更多相关文章
- 计算字符数组长度,用strlen 与 sizeof 的原理与区别
遇到个坑,定义了一个字符数组 unsigned ;i<;i++) { buff[i] = ; } 然后用串口发送函数: write(fd, buff, strlen(buff)); 却发现串口一 ...
- php检测数组长度的函数sizeof count
php教程检测数组长度的函数sizeof count在php检测数组长度的函数有sizeof count 下面看个简单实例*/$colorlist = array("apple" ...
- otl中遇到的一些字符数组长度问题
最近做的项目中对于数据库的操作为了有一个统一的操作,所以采用了otl技术作为中间媒介,当然,由于是用了别人的库,所以还是出现了很多问题.通过对问题进行分析,也形成了一些常用问题的处理方法. 在用otl ...
- 你必须知道的指针基础-4.sizeof计算数组长度与strcpy的安全性问题
一.使用sizeof计算数组长度 1.1 sizeof的基本使用 如果在作用域内,变量以数组形式声明,则可以使用sizeof求数组大小,下面一段代码展示了如何使用sizeof: ,,,,,}; int ...
- C++语言中std::array的神奇用法总结,你需要知道!
摘要:在这篇文章里,将从各个角度介绍下std::array的用法,希望能带来一些启发. td::array是在C++11标准中增加的STL容器,它的设计目的是提供与原生数组类似的功能与性能.也正因此, ...
- c语言字符数组与字符串的使用详解
转自:http://www.jb51.net/article/37456.htm 1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ ...
- c语言中的字符数组与字符串
1.字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y ...
- C 语言字符数组的定义与初始化
1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'} ...
- C语言字符数组和字符串
用来存放字符的数组称为字符数组,例如: char a[10]; //一维字符数组 char b[5][10]; //二维字符数组 char c[20]={'c', ' ', 'p', 'r', 'o' ...
随机推荐
- 微信小程序-饮食日志_开发记录01
今天主要了解微信小程序的框架结构以及环境部署等. 小程序的框架主要分为: js.json.wxss.wxml等 和java web的内容相似,主要了解内部代码的使用情况和语言方式. 主要写了页面的框架 ...
- JavaScript精进篇
JavaScript是所有前端框架中最基础的框架,在工作了两年以后又重新回到了这里.过去两年里用的最多的前端框架是jquery,因为它简单易上手,而jquery就是封装了JavaScript.重新系统 ...
- 【leetcode&CN&竞赛】1198.Find Smallest Common Element in All Rows
题目如下: 给你一个矩阵 mat,其中每一行的元素都已经按 递增 顺序排好了.请你帮忙找出在所有这些行中 最小的公共元素. 如果矩阵中没有这样的公共元素,就请返回 -1. 示例: 输入:mat = [ ...
- chrome浏览器调试js,结果Sources里面找不到js文件解决办法
页面出现问题,就debug,这是前端开发工程师最常见的做法,但是有时候,我们打开开发者工具,在sources查找js文件,却发现怎么也找不到,无法设置断点.但是文件在network选项卡里确实 ...
- js 获取 URL的参数 session
<script type="text/javascript"> window.onload = function () { //var content = getPar ...
- php上传大文件
1.使用PHP的创始人 Rasmus Lerdorf 写的APC扩展模块来实现(http://pecl.php.net/package/apc) APC实现方法: 安装APC,参照官方文档安装,可以使 ...
- 中南林业大学校赛 I 背包问题 ( 折半枚举 || 01背包递归写法 )
题目链接 题意 : 中文题 分析 : 价值和重量都太过于大,所以采用折半枚举的方法,详细可以看挑战的超大背包问题 由于 n <= 30 那么可以不必直接记录状态来优化,面对每个用例 直接采用递 ...
- 箭头函数详解()=>{}
摘要:箭头函数有几个使用注意点. (1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象,箭头函数继承而来的this指向永远不变. (2)不可以当作构造函数,也就是说,不可以使用n ...
- 原生实现ajax解析--XMLHttpRequest
ajax基础: Asynchronous JavaScript and XML,意思就是用JavaScript执行异步网络请求. 如果仔细观察一个Form的提交,你就会发现,一旦用户点击“Submit ...
- springboot+druid+mybatis-Plus 配置详解
网上找了很多关于springboot+druid+mybatis-Plus的配置,遇见的很多问题 也没找到好的解决方案.折腾了好几天终于自己配置通过了. springboot的pom文件 <pa ...