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