在此程序中,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/

10-12 14:53
查看更多