在此计划中,行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;
}
答案 0 :(得分:6)
参数a是指向不完整类型的指针。你不能在它上面使用sizeof,因为它是一个指向数组的指针,并且没有定义数组的大小。
您可以定义它:
void func(int (*a)[10]){
在这种情况下,sizeof(*a)
将等于sizeof( int )*10
,而sizeof(*a)/sizeof(int);
将给出a的元素数,在这种情况下为10。
由于您将指针传递给大小为3的数组,因此您应该使用3而不是10。
您可以使用forward参数来设置变量大小的参数a
。
答案 1 :(得分:6)
标准说:
sizeof
运算符不适用于具有函数类型或不完整类型的表达式 [..]
未知大小的数组类型是不完整类型(C11:6.2.5类型 - 第22页)。 *a
中func
的类型不完整。在将数组用作a
的操作数之前,需要指定数组sizeof
指向的长度。