C语言之sizeof的陷阱

本文探讨了C语言中sizeof运算符的一个常见陷阱,通过一道面试题解释了即使数组越界,sizeof仍能返回类型大小。作者指出,sizeof不进行实际运算,仅返回类型属性。举例说明后,解答了为何`sizeof(a[3])`会输出16,即该二维数组元素的类型大小。
摘要由CSDN通过智能技术生成

这篇文章主要来讲解一下sizeof的一些陷阱,那么开头先来一道面试的题目:

int main()
{
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a[3]));
	return 0;
}

这段代码看似简单,但其实大有文章,接下来我来为大家进行分析:

首先a是数组名,且该数组是一个二维数组,代表的是三行四列的数组,如下图:

如图所示,该二维数组只有三行,而a[3]代表的则是第四行,此时肯定很多人都会觉得这个代码将会出现运行错误,但其实这个代码的运行结果是16,那么为什么是16呢?不是这个二维数组不是只有三行吗?为什么可以算出第四行元素的大小呢?

带着这些疑问,我们继续往下面进行分析;

其实,在C语言里面,运算有两种属性,分别是 1 . 值属性  2 . 类型属性

值属性很容易理解,即为运算的结果,

而类型属性则是不需要进行运算,根据数据存放的类型从而进行输出

下面我们来举个例子:

#include <stdio.h>
int main()
{
	short s = 4;
	int a = 5;
	printf("%d\n", sizeof(s = a + 4));
	printf("%d\n", s);
	return 0;
}

我们对这个代码进行编译,可以得到结果是:

 

那么我们可以得出:

szieof()内部的表达式是不进行运算的,且直接输出类型属性,
故printf("%d\n", s);中的s还是原来的值,没有上一步的运算,所以结果是2和4

那么回到原先的问题,printf("%d\n", sizeof(a[3]));的输出结果是16也不足为奇了,因为虽然a数组只有三行,而这里指代的是第四行,但是sizeof()内部是不进行运算的,只是得出其类型属性。

好了,以上是我对sizeof陷阱的分享!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值