这篇文章主要来讲解一下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陷阱的分享!