1

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

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

产生:400

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

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

产生:8

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

谢谢你的帮助!

4

3 回答 3

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 个整数)。

顺便说一句,还要考虑std::vector,并花很多时间阅读一本好的 C++ 编程书籍。

于 2013-11-10T17:10:23.217 回答
2

C 数组可以隐式地简化为指针,它们将是。为了sizeof正常工作,您需要执行以下操作:

template<size_t N>
void func(char (&arr)[N])
{
/* sizeof(arr) == N in this scope */
}

或者你可以使用 C++11 std::array

于 2013-11-10T17:17:16.263 回答
1

main数组中,大小将是 4*100 = 400,但是当您将数组的地址传递给另一个函数时,它现在是一个指向数组的指针,这意味着X现在的大小是被调用函数中指针的大小。

于 2013-11-10T17:12:58.247 回答