【问题标题】:How to find the size of integer array如何找到整数数组的大小
【发布时间】:2010-05-05 12:54:11
【问题描述】:

如何在 C 中求整数数组的大小。

任何可用的方法,无需遍历整个数组一次,即可找出数组的大小。

【问题讨论】:

  • 你是如何实现这个数组的?原则上,您要么知道 O(1)(已知大小)、O(N)(零终止)的数组大小,要么不可能。
  • 通常数组是作为静态变量创建的,你必须在创建它时传递了一些长度。
  • @Jack:为什么数组“通常”是静态的???
  • int len = strlen(array); ???
  • “任何可用的方法,无需遍历整个数组一次,以找出数组的大小。” - 我想知道你将如何遍历数组 事先知道它的大小?

标签: c arrays


【解决方案1】:

如果数组是全局变量、静态变量或自动变量 (int array[10];),则 sizeof(array)/sizeof(array[0]) 有效。

如果它是动态分配的数组 (int* array = malloc(sizeof(int)*10);) 或作为函数参数传递 (void f(int array[])),那么您在运行时无法找到它的大小。您必须将尺寸存储在某处。
请注意,即使对于第二种情况,sizeof(array)/sizeof(array[0]) 也可以正常编译,但它会默默地产生错误的结果。

【讨论】:

  • 也许提到并指出一个解释数组衰减的问题?常见话题
  • 对于遇到此 C 问题的 C++ 新手:Everything you ever wanted to know about arrays in C++ in one FAQ。
  • sizeof 周围的括号是否必要?
  • @lololololol 原则上,您可以使用不带括号的 sizeof。除了在某些情况下。我什至从未尝试阅读细则,而是遵循了始终使用它们的常见做法。
【解决方案2】:

如果数组是静态分配的:

size_t size = sizeof(arr) / sizeof(int);

如果数组是动态分配的(堆):

int *arr = malloc(sizeof(int) * size);

其中可变大小是 arr 的维度。

【讨论】:

  • 永远不要使用 size 名称作为标识符,这可能会导致问题。
【解决方案3】:

Windows 中的_msize(array) 或Linux 中的malloc_usable_size(array) 应该适用于动态数组

两者都位于 malloc.h 中,并且都返回 size_t

【讨论】:

    【解决方案4】:
    int len=sizeof(array)/sizeof(int);
    

    应该可以。

    【讨论】:

    • 它可以工作,但是site_t len = sizeof(array)/sizeof(array[0]); 更好一些(即当数组元素的数据类型发生变化时它仍然有效。
    • @Grzegorz:向我们展示它是如何用于这个数组的:void f(int array[]) { site_t len = sizeof(array)/sizeof(array[0]); }
    • @Paul R:为什么不呢?除非array 是不完整类型(一种情况);如果它是int 的数组,这将起作用。
    • @sbi:名字不好的array参数其实是一个指针。
    • @Charles:请参阅 sbi 的回答,了解为什么这只适用于某些情况。
    猜你喜欢
    • 2015-05-02
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    相关资源
    最近更新 更多