为什么这个sizeof运算符会出错?

use*_*291 1 c c++ pointers

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

thi*_*his 6

参数a是指向不完整类型的指针.您不能在其上使用sizeof,因为它是指向数组的指针,并且未定义数组的大小.

你可以定义它:

void func(int (*a)[10]){
Run Code Online (Sandbox Code Playgroud)

在这种情况下sizeof(*a)将相等于sizeof( int )*10sizeof(*a)/sizeof(int);会给的元素计数,这是10在这种情况下.

由于您将指针传递给大小为3的数组,因此您应该使用3而不是10.您可以使用forward参数来设置可变大小的参数a.


hac*_*cks 6

标准说:

C11:6.5.3.4

sizeof操作者不得应用于具有功能型或表达不完全类型 [..]

未知大小的数组类型是不完整类型(C11:6.2.5类型 - p22).*ain func是不完整的类型.在将数组a作为操作数之前,需要指定数组点的长度sizeof.