我需要在函数中使用传递的数组'X'的长度。该数组在main函数中创建。我从主函数中打印出以下内容:
std::cout << "\n" << sizeof(X);
产生:400
然后将数组'X'传递给需要X长度的函数。我从函数中打印出以下内容:
std::cout << "\n" << sizeof(X);
产生:8
我期待400,因为我的数组有100个浮点元素。为什么sizeof()返回的大小与在main函数中调用时的大小不同? (我向你保证,数组X中实际上有100个元素,因为程序的其余部分可以工作。)
感谢您的帮助!
答案 0 :(得分:4)
当您将原始数组(例如,声明为int arr[100];
)作为参数传递给其他函数时,它是否会衰减为指针(其大小通常为64位处理器上的8)。
所以你宣布你的数组
int arr[100];
然后你声明你的功能
void f(int arr[]);
被理解为
void (int *arr);
在C ++ 11中,您可以使用std::array,因此声明
std::array<int,100> arr;
并最好通过参考:
void f(std::array<int,100> &arr);
(你可以通过值传递它,但是然后所有100个整数都将被复制到函数调用中。)
BTW,还要考虑std::vector,花上很多时间阅读一本好的C ++编程书。
答案 1 :(得分:2)
C数组可以隐式缩减为指针,它们将是。要使sizeof
正常工作,您需要执行以下操作:
template<size_t N>
void func(char (&arr)[N])
{
/* sizeof(arr) == N in this scope */
}
或者您可以使用C ++ 11 std::array
。
答案 2 :(得分:1)
在main
中,数组大小将是4 * 100 = 400,但是当您将数组的地址传递给另一个函数时,它现在是一个指向数组的指针,这意味着X
的大小是现在调用函数中的指针大小。