在此程序中,int len = sizeof(*a)/sizeof(int);
行给出了错误,但是,如果我编写此int len = sizeof(**a)/sizeof(int);
或此int len = sizeof(a)/sizeof(int);
,则工作正常。这是为什么?在这里,a
保存了一维数组的地址,当我执行此操作时,*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;
}
最佳答案
参数a是指向不完整类型的指针。您不能在其上使用sizeof,因为它是指向数组的指针,并且未定义数组的大小。
您可以定义它:
void func(int (*a)[10]){
在这种情况下,
sizeof(*a)
将等于sizeof( int )*10
,并且sizeof(*a)/sizeof(int);
将给出a的元素计数,在这种情况下为10。由于您要传递指向大小为3的数组的指针,因此应使用3而不是10。
您可以使用正向参数来设置大小可变的参数
a
。关于c++ - 为什么此sizeof运算符给出错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31079232/