探索C语言中数组 sizeof 、 strlen  的奥秘 

在C语言的学习与实践中,数组是一个基础且重要的数据结构。而  sizeof  和  strlen  这两个操作符在处理数组时有着独特的行为和作用。本文将结合具体代码示例,深入剖析它们在不同数组场景下的表现。

 

一、 sizeof  操作符:探究数据占用内存大小

 

 sizeof  是C语言中的一个操作符,用于获取数据类型或变量所占用的字节数,其返回值的类型为  size_t (本质上是无符号整数类型)。

 

1. 一维整型数组

 

在这段代码中:

 

-  sizeof(a) :数组名  a  单独放在  sizeof  内部时,计算的是整个数组的大小,由于数组  a  包含4个  int  类型元素,每个  int  通常占4字节(取决于编译器和平台),所以结果为  4 * 4 = 16  字节。

 

-  sizeof(a + 0) : a + 0  等价于数组首元素的地址,在32位或64位平台上,地址的大小通常为4或8字节。

 

-  sizeof(*a) : *a  是数组的首元素,因此计算的是一个  int  类型元素的大小,即4字节。

 

-  sizeof(a + 1) : a + 1  是数组第二个元素的地址,地址大小同样为4或8字节。

 

-  sizeof(a[1]) : a[1]  是数组的第二个元素,其大小为4字节。

 

-  sizeof(&a) : &a  是整个数组的地址,虽然它和数组首元素地址值可能相同,但类型不同,它仍然是一个地址,大小为4或8字节。

 

-  sizeof(*&a) : *&a  相当于  a ,所以计算的是整个数组的大小,为16字节。

 

-  sizeof(&a + 1) : &a + 1  跳过整个数组,指向数组后面的空间,是一个地址,大小为4或8字节。

 

-  sizeof(&a[0]) : &a[0]  是首元素的地址,大小为4或8字节。

 

-  sizeof(&a[0] + 1) : &a[0] + 1  是第二个元素的地址,大小为4或8字节。

 

2. 字符数组(字符串形式初始化)

 

 

-  sizeof(arr) :数组名  arr  单独在  sizeof  内,计算的是整个数组的大小,因为字符串  "abcdef"  实际在内存中占用7个字节(包含字符串结束符  '\0' ),所以结果为7字节。

 

-  sizeof(arr + 0) : arr + 0  是数组首元素的地址,地址大小为4或8字节。

 

-  sizeof(*arr) : *arr  是数组首元素  'a' ,字符类型占1字节,所以结果为1字节。

 

-  sizeof(arr[1]) : arr[1]  是数组第二个元素  'b' ,大小为1字节。

 

-  sizeof(&arr) : &arr  是数组的地址,地址大小为4或8字节。

 

-  sizeof(&arr + 1) : &arr + 1  跳过整个数组的地址,大小为4或8字节。

 

-  sizeof(&arr[0] + 1) : &arr[0] + 1  是第二个元素的地址,大小为4或8字节。

 

3. 字符数组(字符逐个初始化)

 

 

-  sizeof(arr) :此时数组包含6个字符元素,每个字符占1字节,所以大小为6字节。

 

- 其余关于地址相关的  sizeof  计算,原理与上述情况相同,地址大小为4或8字节;单个元素相关的计算,大小为1字节。

 

二、 strlen  函数:统计字符串长度

 

 strlen  是C标准库中的函数,用于计算字符串中  '\0'  之前的字符个数,其参数必须是指向字符的指针(通常是字符数组名或字符指针)。

 

1. 字符数组(字符串形式初始化)

 

 

 

-  strlen(arr)  和  strlen(arr + 0) : arr  及  arr + 0  都是数组首元素地址, strlen  从该地址开始统计  '\0'  之前的字符个数,结果为6。

 

-  strlen(&arr) : &arr  虽然是数组的地址,但它也是从数组起始位置开始,所以结果同样为6。

 

-  strlen(&arr + 1) : &arr + 1  跳过数组后的地址,从此处开始统计字符串长度是随机值,因为后续内存数据不一定是合法字符串。

 

-  strlen(&arr[0] + 1) : &arr[0] + 1  是第二个字符  'b'  的地址,从这里往后统计字符串长度为5。

 

2. 字符数组(字符逐个初始化)

 

 

 

由于这种方式初始化的字符数组没有字符串结束符  '\0' , strlen  从起始地址开始寻找  '\0'  的过程中会访问非法内存,得到的是随机值,甚至可能导致程序崩溃。

三、总结

 

通过以上对不同数组形式下  sizeof  和  strlen  的分析,我们可以清晰地看到它们的区别和使用要点:

 

-  sizeof  是操作符,用于计算数据类型或变量占用的内存字节数,对数组名操作时需注意其特殊情况(单独使用计算整个数组大小)。

 

-  strlen  是函数,专门用于统计字符串长度,要求参数是指向合法字符串(以  '\0'  结尾)的指针,否则可能导致未定义行为。

 

在C语言编程中,准确理解和运用  sizeof  和  strlen ,能够帮助我们更好地处理数组和字符串相关的操作,避免出现内存错误和逻辑错误。希望本文能为大家在C语言的学习道路上提供有益的参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值