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

Why is this sizeof operator giving error?

本文关键字:出错 运算符 sizeof 为什么      更新时间:2023-10-16

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

标准规定:

C11:6.5.3.4

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

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