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.

原文地址:https://www.cnblogs.com/shilinnpu/p/8853863.html

时间: 2024-08-07 16:45:52

C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别的相关文章

C语言中的字符数组

周末赶数据结构的作业,整理的一些关于C语言中字符数组的困惑与解答. 1.赋值 C语言中,给字符数组char s[]赋值使用strcpy (在string.h头文件中) #include <stdio.h> #include <string.h> int main() { char test[3][4]; strcpy(test[0], "abc"); strcpy(test[1], "adf"); strcpy(test[2], "

字符串和字符数组的细节

字符数组的初始化与sizeof.strlen 1.  sizeof是C语言的一个关键字,也是C语言的一个运算符(sizeof使用时是sizeof(类型或变量名),所以很多人误以为sizeof是函数,其实不是):sizeof运算符用来返回一个类型或者是变量所占用的内存字节数.为什么需要sizeof?主要原因一是int.double等原生类型占几个字节和平台有关:二是C语言中除了ADT外还有UDT,这些用户自定义类型占几个字节无法一眼看出,所以用sizeof运算符来让编译器帮忙计算. 2.strle

你必须知道的指针基础-4.sizeof计算数组长度与strcpy的安全性问题

一.使用sizeof计算数组长度 1.1 sizeof的基本使用 如果在作用域内,变量以数组形式声明,则可以使用sizeof求数组大小,下面一段代码展示了如何使用sizeof: int nums[] = {11,22,33,44,55,66}; int i; // sizeof(nums) 计算nums数组的总字节数 // sizeof(int) 计算int类型所占用的字节数 int length = sizeof(nums)/sizeof(int); for(i=0;i<length;i++)

C语言中sizeof与strlen 的区别

sizeof与strlen是有着本质的区别,sizeof是求数据类型所占的空间大小,而strlen是求字符串的长度,字符串以/0结尾.总的来说sizeof把'\0'也给数上了,而strlen遇到'\0'就停止计数了.区别如下:(1) sizeof是一个C语言中的一个单目运算符,而strlen是一个函数,用来计算字符串的长度.(2)sizeof求的是数据类型所占空间的大小,而strlen是求字符串的长度实例1:printf("char=%d/n",sizeof(char)); //1pr

实验九:二维数组和字符数组的应用

知识点: 二维数组的定义及引用:1.二维数组的定义: 二维数组的定义形式:类型名   数组名[行长度][列长度]:例如:        int  a[3][2]:        定义1个二维数组a,3行2列,6个元素: int   b[5][10]:        定义1个二维数组a,5行10列,50个元素: 二维数组的引用:行下标的范围:0~行长度-1:                        列下表的范围:0~列长度-1: 字符串的存储和运算可以用一维字符数组实现: 一维字符数组的定义

c语言字符数组的初始化问题

1.字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'}; 即把10个字符分别赋给str[0]到str[9]10个元素 如果花括号中提供的字符个数大于数组长度,则按语法错误处理: 若小于数组 长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 '\0' ). 2.字符数组与字符串 在c 语言中,将字符串作为字符数组来处理.(c++中

c语言字符数组与字符串的使用详解

转自:http://www.jb51.net/article/37456.htm 1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ 'I',' ','a','m',' ',‘h','a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号中提供的字符个数大于数组长度,则按语法错误处理:若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 '\0' ). 2.

C语言字符数组的定义与初始化

C 语言字符数组的定义与初始化 1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号中提供的字符个数大于数组长度,则按语法错误处理:若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即'\0' ).2.字符数组与字符串在c 语言中,将字符串作为字符数组来处

C语言-字符数组和字符串

1:概念 用来存放字符的数组成为字符数组. 例如: char a[10]={'a','b','c','d','e','f','j','g','f','k'};// [注意]在C语言中没有字符串,所以用字符数组来存放字符串. 例如: char a[30]={"shisihuansheng.blog"}; char a[30]="shisihuansheng.blog";//这个写法更为简洁,方便,开发时候经常使用. a[0]=s;a[1]=h 依次类推. 在C语言中,