gpt4 book ai didi

c++ - 计算数组的大小

转载 作者:IT老高 更新时间:2023-10-28 21:34:42 30 4
gpt4 key购买 nike

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

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

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com