c++ - 计算数组的大小

标签 c++ c

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

#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/

相关文章:

C++ 多文件错误

C - While 循环内的 If 语句。连续扫描()

c++ - 如何用android ndk和eclipse编译c++11代码?

c++ - GCC 中普通可复制类型的原子对象

c - abs() 在 Xcode 上不起作用?

c - 在 Linux 模块中取消引用指向不完整类型的指针

c++ - 无法从源代码构建 OpenCV

c - 为什么我不能从数组中读取数据?

c++ - 转换运算符如何在 C++ 中工作?

c++ - 传递给 std::for_each 时,仿函数能否保留值?