我的一个同事问了这个问题:Array size in multidimensional array with pointers
答案都非常明确,因为您无法计算出指针引用的数组的大小。
我最初的想法是首先取消引用指针,然后计算数组本身的大小。为什么这行不通?取消引用指针不会给你完整的数组吗?
我的一个同事问了这个问题:Array size in multidimensional array with pointers
答案都非常明确,因为您无法计算出指针引用的数组的大小。
我最初的想法是首先取消引用指针,然后计算数组本身的大小。为什么这行不通?取消引用指针不会给你完整的数组吗?
C中没有“完整数组”,至少不像您所期望的那样。
数组总是可以表示为指向第一个元素的指针,以及有关数组布局的信息。
此信息在运行时不可用,它是实际数组(如int foo[6][2][12]
)类型的一部分,因此编译器可以在生成代码以访问元素时直接使用该知识。正如 Lundin 所指出的,可变长度数组(在 C99 中引入)是个例外。对于那些,编译器必须添加运行时代码才能sizeof
工作。
如果您传递foo
给函数taking int *
,则无法神奇地从中重新创建维度数据。所有看起来都一样的指针int
,你可以传递&foo[0][0][0]
或者只是一个普通的地址int
。
不幸的是,C 中没有办法确定数组的大小。数组只是指向内存位置的指针。您必须知道该位置有多少内存是数组的一部分。
这就是为什么标准库中使用数组的大多数方法要么需要以 nul 结尾的数组,要么需要一个额外的参数来告诉它们它们的长度。