sizeof与strlen常见的笔试题辨析(接上期)

1:sizeof使用过程中常见的类型

例1:

#include<stdio.h>
int main()
{
	int a[] = { 1,2,3,4, };
	printf("%zd\n", sizeof(a));
	printf("%zd\n", sizeof(a+0));
	printf("%zd\n", sizeof(a + 1));
	printf("%zd\n", sizeof*a);
	printf("%zd\n", sizeof(a[1]));
	printf("%zd\n", sizeof(&a) );
	printf("%zd\n", sizeof(*&a));
	printf("%zd\n", sizeof(&a[0]));
	printf("%zd\n", sizeof(&a+1));
	printf("%zd\n", sizeof(&a[0]+1));
	return 0;
}

我们会发现,sizeof的应用场景十分广泛,那么各位读者大大可以试试能否独立思考出这些代码最后实现的结果到底是什么呢?那我也不卖关子了,程序运行结果图如下:

屏幕前的你有没有做对呢 ,现在就让我来简单讲解一下为什么输出结果会是这样子吧。

在这里我首先要提前说明两点:

1:sizeof(数组名)——这里的数组名表示的是整个数组,所以最后得出的结果就是整个数组的大小,单位是字节。

2:&数组名——这里取出的地址也是整个数组的地址。

除此之外一般情况下数组名指的就是数组首元素的地址。

sizeof(a)和sizeof(a+0)看起来好像没有区别,但其实两者相差很多。sizeof(a)指的是整个数组a的大小,而sizeof(a+0)却是a数组首元素的地址所占空间的大小。而我们要注意的是,sizeof(地址)的结果只会是4/8。(在32位系统下为4,64位系统下为8);

sizeof(a+1)指的是数组第二个元素的地址所占空间的大小,所以为4/8;

sizeof*a则是数组第一个元素所占内存的大小,因为数组元素为整形,所以占4个字节;

其它语句都是按这样子来分析,得出图中结果 ,在这里我们需要再特别说一下sizeof(*&a),

这里其实考察了指针的一些知识,*和&其实可以抵消,最后得出的也就是sizeof(a)

接下来我们再看一段代码:

例2:

#include<stdio.h>
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));
	printf("%d\n",sizeof(arr+0));
	printf("%d\n", sizeof(*arr));
	printf("%d\n", sizeof(arr[0]));
	printf("%d\n", sizeof(&arr));
	printf("%d\n", sizeof(&arr+1));
	printf("%d\n", sizeof(&arr[0]+1));
	return 0;

}

通过上面的讲解,你能否完成呢?答案如下: 

2:strlen使用过程中常见的类型

例1:

#include<stdio.h>
#include<string.h>	
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", strlen(arr));
	printf("%d\n",strlen(arr+0));
	printf("%d\n", strlen(*arr));
	printf("%d\n", strlen(arr[0]));
	printf("%d\n", strlen(&arr));
	printf("%d\n", strlen(&arr+1));
	printf("%d\n", strlen(&arr[0]+1));
	return 0;

}

同样的,我们观察并分析这段带代码。

strlen(arr)中arr是首元素地址,那么strlen(arr)就是从首元素开始向后遍历,遇到'\0'后停止,但是很明显数组中并不存在,所以会导致越界访问,最后的结果是个随机值。

strlen(arr+0)同理;

strlen(*arr),*arr相当于’a‘,而strlen本来接收的应该是地址,这里’a‘的Ascall码值是97,strlen就回去访问97指向的这块地址,但是这块地址程序并没有 访问权限,就会导致程序崩溃。

strlen(arr[0])同理;

strlen(&arr)中,&arr是整个数组的地址,最后得出的也是一个随机值(无'\0');

剩下的均和上面的类型一样就不再过多赘述,如果有朋友不懂欢迎在评论区讨论。

 例2:

#include<stdio.h>
#include<string.h>	
int main()
{
	char arr[] = "abcdef";
	printf("%d\n", strlen(arr));
	printf("%d\n",strlen(arr+0));
	printf("%d\n", strlen(*arr));
	printf("%d\n", strlen(arr[0]));
	printf("%d\n", strlen(&arr));
	printf("%d\n", strlen(&arr+1));
	printf("%d\n", strlen(&arr[0]+1));
	return 0;

}

和上面的区别就是在字符串结尾多了'\0';

大家可以试着做一做,原理一样,希望大家能从中有所收获,接下来我分享两个代码,大家试着看一看能不能想出来;

 结语:

如果大家有需要,欢迎点赞留言,后续可以更新一下二维数组sizeof和strlen的计算以及一些典型代码,感谢大家支持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值