我使用以下宏来计算数组的大小:
#define G_N_ELEMENTS(arr) ((sizeof(arr))/(sizeof(arr[0])))
Run Code Online (Sandbox Code Playgroud)
但是,当我计算函数中数组的大小(计算的值不正确)而不是调用函数的位置(计算的正确值)时,我看到它计算的值的差异.代码+输出如下.任何想法,建议,提示等.欢迎.
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);
}
Run Code Online (Sandbox Code Playgroud)
输出:
arr : bffffa40
sizeof arr: 4
arr : bffffa40
sizeof arr: 1
Run Code Online (Sandbox Code Playgroud)
pax*_*blo 27
那是因为a的大小int *是int 指针的大小(我使用的现代平台上有4或8个字节,但它完全取决于平台).它sizeof是在编译时计算的,而不是运行时,因此甚至sizeof (arr[])无法帮助,因为您可以foo()在运行时使用许多不同大小的数组调用该函数.
int数组的大小是int 数组的大小.
这是C/C++中棘手的一点 - 数组和指针的使用并不总是相同的.在很多情况下,数组会衰减到指向该数组的第一个元素的指针.
至少有两种解决方案,兼容C和C++:
{1,2,3,4,-1}.Ben*_*oît 10
在C++中,您可以像这样定义G_N_ELEMENTS:
template<typename T, size_t N>
size_t G_N_ELEMENTS( T (&array)[N] )
{
return N;
}
Run Code Online (Sandbox Code Playgroud)
如果您希望在编译时使用数组大小,请按以下步骤操作:
// ArraySize
template<typename T>
struct ArraySize;
template<typename T, size_t N>
struct ArraySize<T[N]>
{
enum{ value = N };
};
Run Code Online (Sandbox Code Playgroud)
感谢j_random_hacker纠正我的错误并提供其他信息.
| 归档时间: |
|
| 查看次数: |
12528 次 |
| 最近记录: |