返回数组大小的函数始终返回2 我通过编写数组函数来处理我的C++(使用Eclipse和CygWin)。 我有以下代码: int getArraySize(int a[]){ int size = sizeof(a)/sizeof(a[0]); return size; } int main(void) { int arr[5] = {0, 1, 2, 3, 4}; string s = "size of array: "; cout << s << getArraySize(arr) << endl; cout << s << sizeof(arr)/sizeof(arr[0]) << endl; return EXIT_SUCCESS; }

返回数组大小的函数始终返回2 我通过编写数组函数来处理我的C++(使用Eclipse和CygWin)。 我有以下代码: int getArraySize(int a[]){ int size = sizeof(a)/sizeof(a[0]); return size; } int main(void) { int arr[5] = {0, 1, 2, 3, 4}; string s = "size of array: "; cout << s << getArraySize(arr) << endl; cout << s << sizeof(arr)/sizeof(arr[0]) << endl; return EXIT_SUCCESS; },c++,arrays,function,return,C++,Arrays,Function,Return,但我得到的却是: size of array: 2 size of array: 5 我用其他大小的数组和函数getArraySize() 总是返回2。有人知道怎么回事吗?这看起来像一个数组声明,但它不是: int getArraySize(int a[]){ 这只是一个指向int的指针。因此sizeof(a)/sizeof(a[0])只会给出指针大小和指向对象大小之间的比率。如果在括号之间放一个数字,情况不会改变,如下所示: int getArraySize(int a[5]){ 到C+

但我得到的却是:

size of array: 2
size of array: 5
我用其他大小的数组和函数
getArraySize()

总是返回2。有人知道怎么回事吗?

这看起来像一个数组声明,但它不是:

int getArraySize(int a[]){
这只是一个指向int的指针。因此
sizeof(a)/sizeof(a[0])
只会给出指针大小和指向对象大小之间的比率。如果在括号之间放一个数字,情况不会改变,如下所示:

int getArraySize(int a[5]){

到C++编译器,这与int GETARAYSIZE(INT*A)相同。C++没有按值传递数组。它传递指向数组第一个元素的指针。当您给出一个数组参数时,该参数将衰减为指针

sizeof()
运算符将在传递实际数组变量时提供数组中的总字节数,如下所示:

    int arr[5] = {0, 1, 2, 3, 4};
    int arr_size = sizeof(arr) / sizeof(arr[0]);

这看起来像一个数组声明,但不是:

int getArraySize(int a[]){
这只是一个指向int的指针。因此
sizeof(a)/sizeof(a[0])
只会给出指针大小和指向对象大小之间的比率。如果在括号之间放一个数字,情况不会改变,如下所示:

int getArraySize(int a[5]){

到C++编译器,这与int GETARAYSIZE(INT*A)相同。C++没有按值传递数组。它传递指向数组第一个元素的指针。当您给出一个数组参数时,该参数将衰减为指针

sizeof()
运算符将在传递实际数组变量时提供数组中的总字节数,如下所示:

    int arr[5] = {0, 1, 2, 3, 4};
    int arr_size = sizeof(arr) / sizeof(arr[0]);

您使用的是
inta[]
的大小,它实际上是一个指针

看起来您在一台64位机器上,因此:

sizeof(64 bit pointer) = 8

sizeof (int) = 4

8/4 = 2
在32位机器上,您将得到1


问题是,您没有得到
arr
的大小,而且在c++11之前确实没有办法做到这一点,在c++11中,您可以使用
std::array
来代替您使用的是
int a[]
的大小,它实际上是一个指针

看起来您在一台64位机器上,因此:

sizeof(64 bit pointer) = 8

sizeof (int) = 4

8/4 = 2
在32位机器上,您将得到1


问题是你没有得到代码的大小,ARR < /代码>,直到C++ 11,你可以使用一个<代码>:ST::数组< /COD>而不是

< p>,可惜这里的C++语法有点误导。

不能将数组传递给C++函数,只能传递指向第一个元素的指针。

< C++ >声明< /P>
void foo(int x[])
完全一样

void foo(int *x)
即使您在括号之间加上一个尺寸,如中所示

void foo(int x[10])
数字
10
不是语法错误,但将被完全忽略

但是,您可以使用一种有点奇怪的语法从模板函数推断数组大小:

template<typename T, size_t N>
size_t ArraySize(T (&)[N])
{
    return N;
}
模板
大小排列(t(&)[N])
{
返回N;
}

sizeof(x)/sizeof(x[0])
技巧仅在宏中使用时有效。。。它不能放在一个函数中。

不幸的是,C++语法有点误导。

不能将数组传递给C++函数,只能传递指向第一个元素的指针。

< C++ >声明< /P>
void foo(int x[])
完全一样

void foo(int *x)
即使您在括号之间加上一个尺寸,如中所示

void foo(int x[10])
数字
10
不是语法错误,但将被完全忽略

但是,您可以使用一种有点奇怪的语法从模板函数推断数组大小:

template<typename T, size_t N>
size_t ArraySize(T (&)[N])
{
    return N;
}
模板
大小排列(t(&)[N])
{
返回N;
}

sizeof(x)/sizeof(x[0])
技巧仅在宏中使用时有效。。。它不能放在函数中。

我认为你的问题是C++通过引用传递数组,因此你只是在划分地址的大小。

我认为你的问题是C++通过引用传递数组,因此你只是在划分地址的大小。< /p>如果每次被问到我都有一分钱,我可以买苹果。两次。只要使用
vector
(或者
array
,如果你是专家的话),一切都会更好。如果每次问我一分钱,我就可以买苹果了。两次。只要使用
vector
(或者
array
,如果你是专家的话),一切都会更好。但是你应该记住sizeof是编译时。因此,它只适用于已知编译时大小的数组。提问者想做的事永远不会奏效。@Jarryd:这是一个很好的观点。有一些滥用
模板的方法,它们会根据数组长度生成函数的专用版本,给人一种错觉,认为函数调用给出了长度,但实际上它生成的是专用模板函数。@Joe滥用有点强;不管怎么说,当函数内联出来时,效果都很好。我明白了,谢谢你的快速回复!有没有什么好方法可以根据传入的内容(如果我理解正确的话,就是指向元素0的指针)来获取函数中数组的大小?必须将其作为参数传入。或者,不要使用裸数组,而是使用
std::vector
。因此,它只适用于已知编译时大小的数组。提问者想做的事永远不会奏效。@Jarryd:这是一个很好的观点。有一些滥用
模板的方法,它们会根据数组长度生成函数的专用版本,给人一种错觉,认为函数调用给出了长度,但实际上它生成的是专用模板函数。@Joe滥用有点强;不管怎么说,当函数内联出来时,效果都很好。我明白了,谢谢你的快速回复!有没有什么好方法可以根据传入的内容(如果我理解正确的话,就是指向元素0的指针)来获取函数中数组的大小?必须将其作为参数传入。