代码之家  ›  专栏  ›  技术社区  ›  Dervin Thunk

数组大小的最大值(C)

  •  0
  • Dervin Thunk  · 技术社区  · 15 年前

    一个简单的问题:当你必须定义某个数组在C中可以接受的(任意)最大值时,人们的做法是什么?因此,有些人只是选择一个希望足够大的整数,而另一些人则选择接近整数的素数(!)等等,其他一些更深奥的数字,比如接近…等等。

    那么,我想知道决定这些价值观的最佳实践是什么?

    谢谢。

    7 回复  |  直到 15 年前
        1
  •  5
  •   Juho Östman    15 年前

    没有一般规则。two的幂用于缓冲区,我经常在c中使用1024作为字符串缓冲区,但任何其他数字都可以。质数对于散列表很有用,在散列表中,简单的模散列可以很好地处理质数大小。当然,您将大小定义为一个符号常量,以便稍后更改它。

        2
  •  5
  •   torak    15 年前

    如果我不能确定一个合理的最大值,我倾向于使用 malloc realloc 根据需要扩大阵列。当你不能保证一个固定大小的数组足够大以达到预期的目的时,使用它是危险的。

        3
  •  3
  •   zwol    15 年前

    最好的 实践是尽可能避免任意限制。

    这并不总是可能的,所以第二个最佳实践是对数组可能需要保持的最大值进行一个有教育意义的估计,然后以一个健康的利润率(至少25%)进行汇总。当我这样做的时候,我倾向于使用10的幂,因为在检查时,很明显这个数是一个任意的极限。(2的幂通常也意味着,但只有当读者将数字识别为2的幂时,大多数代码的读者才不会记住2之后的表格 十六 . 如果有充分的理由使用2的幂,并且它需要大于2的幂,那么用十六进制写它。离题结束。)始终记录您对数组所需保存的最大内容的估计背后的推理,即使它很简单,就像“任何具有大于2GB的单个源文件的人都需要重新考虑其编码风格”。( actual example )

    不要使用质数,除非您特别需要质数的属性(如juho提到的,对于散列表——但是如果散列函数不是很好,您只需要这样做——但很不幸,通常是这样)。当您这样做时,请记录下您有意使用质数的情况以及原因,因为大多数人不认识质数。可以看到的素数,或者知道在特定情况下它们可能是必要的。

        4
  •  0
  •   Petr Macek    15 年前

    如果我需要这样做,我通常使用2的幂,或者对于更大的数据集,使用保存数据所需的页数。不过,大多数情况下,我更喜欢在堆上分配一块内存,然后在缓冲区大小稍后不足时重新分配。

        5
  •  0
  •   Chuck    15 年前

    只有当我有充分的理由让某个数字成为最大值时,我才定义一个最大值。否则,我会动态地调整它的大小,可能会使用“健全性检查”的最大值(例如,一个人的名字不应该有几兆字节长)。

        6
  •  0
  •   nategoose    15 年前

    使用整数(2的幂)是因为它们通常易于使用,例如malloc(许多实现在两个大小的不同幂的块中跟上内存),便于链接器使用(在静态或全局数组的情况下),还因为您可以使用位运算来测试它们的极限,这通常比使用n<和>。

    使用质数是因为使用质数大小的哈希表可以避免冲突。

    不过,许多人可能会同时使用两种大小的质数和幂,以防它们实际上没有提供任何好处。

        7
  •  0
  •   user191776    15 年前

    从一开始就无法预测最大尺寸是多少。

    例如,我编写了一个小的命令行解释器,其中生成的每一行输出都存储在一个大小为char的数组中。 二百 . 对所有可能的输出都足够了,你不认为吗?

    直到我发出了env命令~ 四百 字符(!).

    LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;
    05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;
    32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;
    31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;
    35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:';
    

    故事的寓意: 尽量使用动态分配。