【问题标题】:OK to use a terminator to manage fixed length arrays?可以使用终结器来管理固定长度的数组吗?
【发布时间】:2011-07-18 20:26:42
【问题描述】:

我正在使用具有大量固定长度数组的 ANSI C。与其为每个数组设置一个数组长度变量,不如在数组末尾添加一个“NULL”终止符似乎更容易,类似于字符串。在我当前的应用程序中,我使用的是“999999”,它永远不会出现在实际数组中。我可以通过查找终止符来执行循环并确定数组长度。这是一种常见的方法吗?它有什么问题?谢谢。

【问题讨论】:

  • sizeof(my_array)/sizeof(my_array_type) 有什么问题?
  • @Ed: sizeof(my_array) / sizeof(*my_array) 为您提供数组的大小(容量),而不是根据程序逻辑使用的实际元素。
  • 如果您使用的是固定长度的数组,那么为什么需要终止它们呢?终结符用于可变长度字符串/数组。如果它们实际上是可变长度的,那么@yan 在下面有正确的答案。
  • @Mannimarco:“会员 5 个月”不用担心。你会看到更多。

标签: c arrays


【解决方案1】:

您的main 参数在技术上使用了这种方法,其中最后一个值是一个终端NULL,但它还伴随着一个告诉您大小的argc

仅使用终端听起来将来更容易出错。将大小与数组一起存储有什么问题?

类似:

struct fixed_array {
   unsigned long len;
   int arr[];
};

这也将更高效且不易出错。

【讨论】:

    【解决方案2】:

    我能想到的主要问题是跟踪长度可能很有用,因为 C 中有内置函数将长度作为参数,你需要它知道长度才能知道在哪里添加下一个元素也是。

    实际上,它取决于数组的大小,如果它是一个巨大的数组,则应该跟踪长度。否则,每次要在末尾添加元素时循环遍历它以确定长度将非常昂贵。 O(n) 而不是通常使用数组获得的 O(1) 时间

    【讨论】:

      【解决方案3】:

      这种方法的主要问题是,如果不循环到数组的末尾,您无法提前知道长度 - 如果您只想确定长度,这会对性能产生非常负面的影响。

      【讨论】:

        【解决方案4】:

        你为什么不直接

        1. 使用const int 对其进行初始化,您可以稍后在代码中使用它来检查大小,或者
        2. 使用int len = sizeof(my_array) / sizeof(the_type)

        【讨论】:

        • 我的大多数数组都是二维的,所以 size_t length = sizeof(myArray)/sizeof(type) 给了我整个数组中元素的数量。我需要每行中的元素数。那怎么办?
        • @MonkeyBusiness,将这个关键细节添加到问题中!
        【解决方案5】:

        由于您使用二维数组来保存不规则数组,因此您可以只使用不规则数组:type *my_array[];。或者您可以将长度放在每行的元素 0 中,并将这些行视为 1 索引数组。使用一些邪恶的技巧,您甚至可以将长度放在每行的元素 -1![1]

        1. 留作练习 ;)

        【讨论】:

          猜你喜欢
          • 2012-01-04
          • 2020-10-15
          • 2016-02-16
          • 1970-01-01
          • 2011-05-30
          • 2011-05-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多