在 C++ 中将数组传递给函数时,为什么 sizeof() 不能像在 main 函数中那样工作?
When passing an array to a function in C++, why won't sizeof() work the same as in the main function?
所以我的 C++ 讲师在 class 中告诉我们,C++ 中没有确定数组大小的函数,我对此并不满意。我在 Whosebug 上发现了一个问题,它给出了这段代码 (sizeof(array)/sizeof(*array))
虽然我不完全理解它,但我知道它需要分配给数组的内存总量并将其除以我假设的是其数据类型的默认内存分配...(???)
我决定练习编写函数(我在学习 CS 111 - 基础知识 1)并编写一个函数来返回我传递给它的任何数组中的元素数。这是我写的:
#include <iostream>
using namespace std;
int length_of_array(int some_list[])
{
// This only returns the integer 1 for some reason
return (sizeof(some_list)/sizeof(*some_list));
}
int main()
{
// Declare and initialize an array with 15 elements
int num_list[] = {2,4,6,8,10,12,14,16,18,20,22,24,26,28,30};
//Outputs what I assume is the total size in bytes of the array
cout << sizeof(num_list) << endl;
//Outputs what I assume to be size of memory set aside for each in element in an array
cout << sizeof(*num_list) << endl;
//This extrapolates array's number of elements
cout << "This is the output from direct coding in the\nint main function:\n" <<
(sizeof(num_list)/sizeof(*num_list)) << endl;
//This function should return the value 15 but does not
int length = length_of_array(num_list);
cout << "This is the length of the array determined\n";
cout << "by the length_of_array function:\n" << length << endl;
return 0;
}
函数returns1 不管我做什么。有人能给我一个特定于 C++ 的解决方法并解释它是如何工作的吗?
谢谢。
问题出在这里:
int length_of_array(int some_list[]);
基本上,无论何时将数组作为函数的参数传递,无论是像 int arr[]
还是 int arr[42]
一样传递它,数组都会衰减为指针(有一个例外,请参阅下面),所以上面的签名等同于
int length_of_array(int* some_list);
当然,当执行 sizeof(some_list)/sizeof(*some_list)
时,您将得到数组衰减到的指针大小与表示第一个元素的类型大小之间的比率。在你的例子中,1,在你的机器上,指针的大小可能是 4 个字节(32 位),与 int
.
的大小相同
所以我的 C++ 讲师在 class 中告诉我们,C++ 中没有确定数组大小的函数,我对此并不满意。
你的老师错了!有一种通过引用传递数组并获取其大小的方法:
template<size_t N>
int length_of_array(int (&arr)[N])
{
std::cout << N << std::endl; // WORKS!
return N;
}
所以我的 C++ 讲师在 class 中告诉我们,C++ 中没有确定数组大小的函数,我对此并不满意。我在 Whosebug 上发现了一个问题,它给出了这段代码 (sizeof(array)/sizeof(*array))
虽然我不完全理解它,但我知道它需要分配给数组的内存总量并将其除以我假设的是其数据类型的默认内存分配...(???)
我决定练习编写函数(我在学习 CS 111 - 基础知识 1)并编写一个函数来返回我传递给它的任何数组中的元素数。这是我写的:
#include <iostream>
using namespace std;
int length_of_array(int some_list[])
{
// This only returns the integer 1 for some reason
return (sizeof(some_list)/sizeof(*some_list));
}
int main()
{
// Declare and initialize an array with 15 elements
int num_list[] = {2,4,6,8,10,12,14,16,18,20,22,24,26,28,30};
//Outputs what I assume is the total size in bytes of the array
cout << sizeof(num_list) << endl;
//Outputs what I assume to be size of memory set aside for each in element in an array
cout << sizeof(*num_list) << endl;
//This extrapolates array's number of elements
cout << "This is the output from direct coding in the\nint main function:\n" <<
(sizeof(num_list)/sizeof(*num_list)) << endl;
//This function should return the value 15 but does not
int length = length_of_array(num_list);
cout << "This is the length of the array determined\n";
cout << "by the length_of_array function:\n" << length << endl;
return 0;
}
函数returns1 不管我做什么。有人能给我一个特定于 C++ 的解决方法并解释它是如何工作的吗? 谢谢。
问题出在这里:
int length_of_array(int some_list[]);
基本上,无论何时将数组作为函数的参数传递,无论是像 int arr[]
还是 int arr[42]
一样传递它,数组都会衰减为指针(有一个例外,请参阅下面),所以上面的签名等同于
int length_of_array(int* some_list);
当然,当执行 sizeof(some_list)/sizeof(*some_list)
时,您将得到数组衰减到的指针大小与表示第一个元素的类型大小之间的比率。在你的例子中,1,在你的机器上,指针的大小可能是 4 个字节(32 位),与 int
.
所以我的 C++ 讲师在 class 中告诉我们,C++ 中没有确定数组大小的函数,我对此并不满意。
你的老师错了!有一种通过引用传递数组并获取其大小的方法:
template<size_t N>
int length_of_array(int (&arr)[N])
{
std::cout << N << std::endl; // WORKS!
return N;
}