C语言函数数组形参sizeof计算错误选项原因解析
问题涉及的C语言核心规则
要判断各选项对错,首先要明确三个C语言标准规定的基础逻辑:
- 数组作为函数形参传递时,会被编译器隐式调整为指向数组首元素的指针,形参层面不存在真正的数组类型,所有数组形参最终都会变成对应指针类型
sizeof运算符只能作用于完整类型(编译器在编译期明确知道内存占用大小的类型),对不完全类型使用sizeof会直接触发编译错误,不存在合法计算结果- 题目给定环境
sizeof(int)=4、sizeof(void*)=8,所有指针类型的大小均为8。
各形参的sizeof合法计算逻辑
形参p1:int** p1
p1本身是二级int指针,不存在数组调整:
p1是指针类型,大小为8*p1是对二级指针一次解引用,得到int*类型(一级int指针),大小为8**p1是对二级指针二次解引用,得到int类型,大小为4
对应选项3的计算完全正确,选项4的sizeof(**p1) == 8计算错误。
形参p2:int p2[][]
这个函数声明本身是非法无效的:
C语言定义多维数组时,必须指定除最高维(第一维)之外所有维度的长度,否则数组元素类型属于不完全类型。int p2[][]声明的数组元素类型是int[](长度未知的int数组,属于不完全类型),即使按照形参调整规则尝试将其转为指针,最终得到的类型是int (*p2)[](指向未知长度int数组的指针):
- 虽然调整后p2本身是指针,
sizeof(p2) == 8的数值看起来正确,但*p2的类型是int[](不完全类型),对其使用sizeof属于语法错误,根本无法得到合法的计算结果,更不可能推出sizeof(*p2) ==8、sizeof(**p2)==4的结论。
这就是选项2错误的根本原因:它基于一个非法的形参声明推导sizeof结果,逻辑前提完全不成立,选项7同样因这个原因错误。
形参p3:int p3[3][5]
这是合法的二维数组形参,按照形参调整规则,它会被隐式转换为指向首元素的指针:二维数组的首元素是长度为5的int数组,因此p3的实际类型是int (*p3)[5](指向包含5个int元素的数组的指针):
p3本身是指针类型,大小为8*p3是对该指针一次解引用,得到int[5]类型的数组,大小为5*sizeof(int) = 5*4**p3是对该指针二次解引用,得到int类型,大小为4
对应选项6的计算完全正确,选项1、5的相关计算错误。
最终结论
所有选项中仅3、6的计算是基于合法C语法的正确推导,选项2因对应函数声明本身非法、sizeof计算无合法依据,判定为错误。
内容的提问来源于stack exchange,提问作者PythonAddict
相关产品推荐
相关产品推荐

