在这个程序中,行 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/