当前位置:  开发笔记 > 编程语言 > 正文

计算数组的大小

如何解决《计算数组的大小》经验,为你挑选了3个好方法。

我使用以下宏来计算数组的大小:

#define G_N_ELEMENTS(arr) ((sizeof(arr))/(sizeof(arr[0])))  

但是,当我计算函数中数组的大小(计算的值不正确)而不是调用函数的位置(计算的正确值)时,我看到它计算的值的差异.代码+输出如下.任何想法,建议,提示等.欢迎.

DP

#include 

#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

paxdiablo.. 27

那是因为a的大小int *是int 指针的大小(我使用的现代平台上有4或8个字节,但它完全取决于平台).它sizeof是在编译时计算的,而不是运行时,因此甚至sizeof (arr[])无法帮助,因为您可以foo()在运行时使用许多不同大小的数组调用该函数.

int数组的大小是int 数组的大小.

这是C/C++中棘手的一点 - 数组和指针的使用并不总是相同的.在很多情况下,数组会衰减到指向该数组的第一个元素的指针.

至少有两种解决方案,兼容C和C++:

使用数组传入长度(如果函数的意图实际计算出数组大小,则没有那么有用).

传递标记数据结尾的标记值,例如{1,2,3,4,-1}.


小智.. 12

这不起作用,因为sizeof是在编译时计算的.该函数没有关于其参数大小的信息(它只知道它指向一个内存地址).

考虑使用STL向量,或将数组大小作为参数传递给函数.



1> paxdiablo..:

那是因为a的大小int *是int 指针的大小(我使用的现代平台上有4或8个字节,但它完全取决于平台).它sizeof是在编译时计算的,而不是运行时,因此甚至sizeof (arr[])无法帮助,因为您可以foo()在运行时使用许多不同大小的数组调用该函数.

int数组的大小是int 数组的大小.

这是C/C++中棘手的一点 - 数组和指针的使用并不总是相同的.在很多情况下,数组会衰减到指向该数组的第一个元素的指针.

至少有两种解决方案,兼容C和C++:

使用数组传入长度(如果函数的意图实际计算出数组大小,则没有那么有用).

传递标记数据结尾的标记值,例如{1,2,3,4,-1}.



2> 小智..:

这不起作用,因为sizeof是在编译时计算的.该函数没有关于其参数大小的信息(它只知道它指向一个内存地址).

考虑使用STL向量,或将数组大小作为参数传递给函数.



3> Benoît..:

在C++中,您可以像这样定义G_N_ELEMENTS:

template 
size_t G_N_ELEMENTS( T (&array)[N] )
{
  return N;
}

如果您希望在编译时使用数组大小​​,请按以下步骤操作:

// ArraySize
template 
struct ArraySize;

template 
struct ArraySize 
{ 
  enum{ value = N };
};

感谢j_random_hacker纠正我的错误并提供其他信息.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有