我正在使用以下宏来计算数组的大小:
#define G_N_ELEMENTS(arr) ((sizeof(arr))/(sizeof(arr[0])))
但是,当我评估函数中数组的大小(计算的值不正确)与调用函数的位置(计算的值正确)相反时,我发现它计算的值存在差异。下面的代码+输出。任何想法、建议、提示等。欢迎。
DP
#include <stdio.h>
#define G_N_ELEMENTS(arr) ((sizeof(arr))/(sizeof(arr[0])))
void foo(int * arr) // Also tried foo(int arr[]), foo(int * & arr)
// - neither of which worked
{
printf("arr : %x\n", arr);
printf ("sizeof arr: %d\n", G_N_ELEMENTS(arr));
}
int main()
{
int arr[] = {1, 2, 3, 4};
printf("arr : %x\n", arr);
printf ("sizeof arr: %d\n", G_N_ELEMENTS(arr));
foo(arr);
}
输出:
arr : bffffa40
sizeof arr: 4
arr : bffffa40
sizeof arr: 1
最佳答案
这是因为 int *
的大小是 int pointer 的大小(在我使用的现代平台上为 4 或 8 个字节,但它完全取决于平台)。 sizeof
是在编译时计算的,而不是在运行时计算的,所以即使 sizeof (arr[])
也无济于事,因为您可以调用 foo()
在运行时使用许多不同大小的数组的函数。
一个int数组的大小就是一个int数组的大小。
这是 C/C++ 中的棘手问题之一 - 数组和指针的使用并不总是相同的。在很多情况下,数组会衰减为指向该数组第一个元素的指针。
至少有两种解决方案,同时兼容C和C++:
- 将长度与数组一起传递(如果函数的意图是实际计算出数组大小,则不是那有用)。
- 传递一个标记数据结束的标记值,例如,
{1,2,3,4,-1}
。
关于c++ - 计算数组的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/720077/