返回数组大小的函数始终返回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++编译器,这与
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++编译器,这与
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的指针)来获取函数中数组的大小?必须将其作为参数传入。