为什么在这个函数(C++)中说数组的长度是1?

Why does it say the length of the array is 1 in this function (C++)?

所以我试图创建一个函数,通过返回数组的大小和整数类型的大小来获取数组的长度...

代码:

#include <cstdio>
#include <iostream>
using namespace std;

int len(int *thing) {
    return sizeof(thing) / sizeof(int);
}

int main() {
    int fard[] = {100, 45, 1, 723, 500};
    cout << len(fard);
}

... 当我 运行 代码时,它只是 returns 和 1

我该如何解决/我做错了什么。

因为sizeof(thing) / sizeof(int)大概等价于4 / 4 == 1。 因为 thing 是一个指针,而指针在 32 位编译器上的大小为 4 个字节。

这里:

len(fard)

当您将 fard 传递给函数时,它会衰减为一个指针。这意味着它丢失了大小信息。所以在函数 len 中,您将单个 pointer 除以 sizeof(int).

函数参数是指针类型

int len(int *thing) {
    return sizeof(thing) / sizeof(int);
}

即使你会像这样重写函数

int len(int thing[]) {
    return sizeof(thing) / sizeof(int);
}

尽管如此,编译器会将函数参数的数组类型调整为指向第一个函数声明中所写的数组元素类型的类型指针。

因此在函数内,表达式 sizeof(thing) 产生指针的大小。如果指针的大小等于 sizeof( int ) 的值,则函数 returns 1.

你可以改写

template <size_t N>
size_t len(const int ( &thing )[N] ) {
    return N;
}

然后

cout << len(fard);

得到数组的元素个数fard.

注意在C++ 17的头文件<iterator>中已经声明了标准的C++函数std::size

所以你可以这样写

#include <iterator>

//...

std::cout << std::size(fard);

试试这个

#include <cstdio>
#include <iostream>
using namespace std;

template< std::size_t N >
int len(int (&thing)[N] ) {
    return sizeof(thing) / sizeof(int);
}

int main() {
    int fard[] = {100, 45, 1, 723, 500};
    cout << len(fard);
}

结果:

Program stdout
5

代码:https://godbolt.org/z/qzdbqEYx1

顺便说一下,x86_64 你的原始代码 returns 2 = sizeof(64 bit pointer)/sizeof(32 bit int)