sizeof()在main函数和另一个函数的同一个数组上调用时返回不同的值

时间:2013-11-10 17:08:12

标签: c++ arrays sizeof

我需要在函数中使用传递的数组'X'的长度。该数组在main函数中创建。我从主函数中打印出以下内容:

std::cout << "\n" << sizeof(X);

产生:400

然后将数组'X'传递给需要X长度的函数。我从函数中打印出以下内容:

std::cout << "\n" << sizeof(X);

产生:8

我期待400,因为我的数组有100个浮点元素。为什么sizeof()返回的大小与在main函数中调用时的大小不同? (我向你保证,数组X中实际上有100个元素,因为程序的其余部分可以工作。)

感谢您的帮助!

3 个答案:

答案 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的大小是现在调用函数中的指针大小。