`

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

    博客分类:
  • C++
 
阅读更多

字符数组的长度计算:必须以终止符’/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语言中计算字符串长度与分割字符串的方法

    C语言strlen()函数:返回字符串的长度 头文件: #include strlen()函数用来计算字符串的长度,其原型为: unsigned int strlen (char *s); 【参数说明】s为指定的字符串。 strlen()用来计算指定的字符串s 的...

    c语言strlen转义字符,转义字符 & sizeof & strlen-CSDN博客.mhtml

    c语言strlen转义字符,转义字符 & sizeof & strlen-CSDN博客.mhtml

    sizeof与strlen区别详解

    c语言中最常遇到的问题是字符串处理问题,特别是字符串长度:sizeof与strlen.两者使用时一定要区分开,否着会很容易出错。本文对两者的区别做了详细介绍。

    C语言中关于sizeof 和 strlen的区别分析

    用结构类型或变量做参数时,sizeof 返回实际的大小,当用于静态数组时,sizeof 返回全部数组的尺寸。sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸 2、运行时计算strlen,只能用char*做参数,且必须...

    C/C++中获取数组长度的方法示例

    学过C/C++的人都知道,在C/C++中并没有提供直接获取数组长度的函数,对于存放字符串的字符数组提供了一个strlen函数获取其长度,那么对于其他类型的数组如何获取他们的长度呢? 其中一种方法是使用sizeof(array) / ...

    C语言中sizeof()与strlen()的区别详解

    sizeof()和strlen()经常会被初学者混淆,但其中有有很大区别: sizeof() 1. sizeof()【操作数所占空间的字节数大小】是一种c中的基本运算符。 可以以类型、指针、数组和函数等作为参数。 头文件类型为unsigned int。...

    Sizeof与Strlen的区别与联系

    本文档介绍了sizeof和strlen的区别和联系,其中sizeof为运算符,strlen为C语言库函数。而sizeof在计算字符串的长度时,将结束符'\0'也算在内,但是strlen不将它算在内。

    明解C语言(第3版)入门篇.[日]柴田望洋(带详细书签).pdf 【半高清】

    用数组实现的字符串和用指针实现的字符串的不同点 318 字符串数组 320 11-2 通过指针操作字符串 323 判断字符串长度 323 字符串的复制 325 不正确的字符串复制 328 返回指针的函数 329 11-3 字符串处理...

    使用C语言实现字符串的逆序.docx

    字符串逆序 以下是一个使用 C 语言实现字符串逆序的简单例子。这个程序接受用户输入的字符串,然后... // 计算字符串的长度 int length = strlen(inputString); // 调用逆序函数 reverseString(inputString, le

    判断2个字符串是否含有相同的字符

    还是只是记录下来相关位置——这是我底下未完成版本1想到的思路——用一个count[sizeof(A)]数组记录下A每个位置作为起点所能和B达到的最大重合,最后判断查找数组中最大值,此时目标子字符串的起点下标(i)和 i ...

    C语言中sizeof()与strlen()函数的使用入门及对比

    主要介绍了C语言中sizeof()与strlen()函数的使用入门及对比,同时二者在C++中的使用情况也基本上同理,是需要的朋友可以参考下

    使用C语言实现字符串的逆序实现.docx

    字符串逆序 以下是一个使用 C 语言实现字符串逆序的简单例子。这个程序接受用户输入的字符串,然后输出... // 计算字符串的长度 int length = strlen(inputString); // 调用逆序函数 reverseString(inputString,

    C语言讲义.doc

    8.7.5 strlen,字符串长度 42 8.7.6 strcat,字符串追加 42 8.7.7 strncat,字符串有限追加 43 8.7.8 strcmp,字符串比较 43 8.7.9 strncmp,字符串有限比较 43 8.7.10 strcpy字符串拷贝 43 8.7.11 strncpy字符串...

    C语言进阶 作者 Wrestle.Wu

     一维数组、二维数组、多维数组、字符数组、动态数组的定义和引用,以及操作数组时的各种常见错误解析;  不同类型的指针之间的区别,以及指针的一般用法和注意事项;  指针与地址、数组、字符串、函数之间...

    C语言进阶-牟海军.pdf

     一维数组、二维数组、多维数组、字符数组、动态数组的定义和引用,以及操作数组时的各种常见错误解析;  不同类型的指针之间的区别,以及指针的一般用法和注意事项;  指针与地址、数组、字符串、函数之间的...

    C语言面试总结

    1.2 函数与头文件 ...1.19 sizeof与strlen的区别 1.20 实现String类的BIG_FOUR 1.21 struct和union的区别 1.22 char字符变量与int整型数据 1.23 字,字节,字符,比特 1.24 空格、空字符、字符数组结束符的区别

    你必须知道的495个C语言问题

    6.21 当数组是函数的参数时,为什么sizeof不能正确报告数组的大小? 6.22 如何在一个文件中判断声明为extern的数组的大小(例如,数组定义和大小在另一个文件中)?sizeof操作符似乎不行。 6.23 sizeof返回的大小...

    《你必须知道的495个C语言问题》

    1.24 我在一个文件中定义了一个extern数组,然后在另一个文件中使用,为什么sizeof取不到数组的大小? 13 声明问题 14 1.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 14 *1.26 main的正确...

Global site tag (gtag.js) - Google Analytics