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

时间:2015-06-26 17:48:32

标签: 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;
}

2 个答案:

答案 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)

标准说:

C11:6.5.3.4

  

sizeof运算符不适用于具有函数类型或不完整类型的表达式 [..]

未知大小的数组类型是不完整类型(C11:6.2.5类型 - 第22页)。 *afunc的类型不完整。在将数组用作a的操作数之前,需要指定数组sizeof指向的长度。