在这个程序中,该行int len = sizeof(*a)/sizeof(int);给出了错误,但是如果我写这个int len = sizeof(**a)/sizeof(int);或这个int len = sizeof(a)/sizeof(int);,它工作正常.这是为什么?这里a保存了1-D数组的地址,当我这样做时*a,它给出了数组第一个元素的地址,最后**a给出了元素本身.所以基于这个线int len = sizeof(*a)/sizeof(int);应该工作正常,不是吗?
#include <stdio.h>
void func(int (*a)[]){
printf("%d %d\n", sizeof(a), sizeof(int));
int len = sizeof(*a)/sizeof(int); // error
for(int i = 0; i < len; ++i){
printf("%d ", (*a)[i]);
}
}
int main(){
int a[][3] = {
{1, 2, 3},
{4, 5, 6}
};
func(a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
参数a是指向不完整类型的指针.您不能在其上使用sizeof,因为它是指向数组的指针,并且未定义数组的大小.
你可以定义它:
void func(int (*a)[10]){
Run Code Online (Sandbox Code Playgroud)
在这种情况下sizeof(*a)将相等于sizeof( int )*10和sizeof(*a)/sizeof(int);会给的元素计数,这是10在这种情况下.
由于您将指针传递给大小为3的数组,因此您应该使用3而不是10.您可以使用forward参数来设置可变大小的参数a.
标准说:
的
sizeof操作者不得应用于具有功能型或表达不完全类型 [..]
未知大小的数组类型是不完整类型(C11:6.2.5类型 - p22).*ain func是不完整的类型.在将数组a作为操作数之前,需要指定数组点的长度sizeof.