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

标签 c++ c pointers

在这个程序中,行 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 )*10sizeof(*a)/sizeof(int); 将给出 a 的元素计数,在本例中为 10。

由于您要传递一个指向大小为 3 的数组的指针,因此您应该使用 3 而不是 10。 您可以使用前向参数来获得可变大小的参数 a

关于c++ - 为什么这个 sizeof 运算符会出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31079232/

相关文章:

c++ - 在 C++ 中解析设备文件的 ASCII 输出

c - 尝试读取结构元素时的 if 情况

C 读取写入文件

c - 访问指向字符串的指针数组

C 通过将数组中的任何指针转换为 void 指针来交换它们 K&R

c++ - sprintf 为空字符字符串时的预期行为

c++ - 将 std::stream 对象从一个管理器传递到另一个管理器

c++ - 在函数c++中使用指针时出错

c - 如何退出 while 循环?

const 指向 const 的指针