【问题标题】:Iterate through a C array遍历 C 数组
【发布时间】:2009-10-20 23:17:25
【问题描述】:

我在程序的某处创建了一个结构数组。

稍后,我想遍历它,但我没有数组的大小。

如何遍历元素?还是我需要将尺寸存储在某个地方?

【问题讨论】:

    标签: c arrays


    【解决方案1】:

    如果数组的大小在编译时已知,则可以使用结构体大小来确定元素个数。

    struct foo fooarr[10];
    
    for(i = 0; i < sizeof(fooarr) / sizeof(struct foo); i++)
    {
      do_something(fooarr[i].data);
    }
    

    如果在编译时未知,则需要在某处存储大小或在数组末尾创建一个特殊的终止符值。

    【讨论】:

    • 确实,但我宁愿使用sizeof(fooarr[0]) 或sizeof(*fooarr) 而不是sizeof(struct foo)
    【解决方案2】:

    您可以将大小存储在某处,或者您可以拥有一个带有特殊值集的结构体用作标记,就像\0 指示字符串的结尾一样。

    【讨论】:

    • +1 我通常使用指向结构的指针,这样我就可以确定 NULL 是一个独特的哨兵。
    • 我认为遵循空终止字符串模型是个坏主意
    • @hasen j:我同意,除非您知道每次都必须遍历整个数组,在这种情况下,哨兵可以稍微澄清代码。哨兵的问题在于,您最终可能会遇到 O(1) 会发生的 O(N) 行为,但并不总是意识到这一点。
    【解决方案3】:

    这取决于。如果它是一个动态分配的数组,也就是说,您创建它时调用 malloc,那么正如其他人建议的那样,您必须在某处保存数组的大小/元素数量或有一个哨兵(一个具有特殊值的结构,这将是最后一个)。

    如果它是一个静态数组,你可以调整它的大小/一个元素的大小。例如:

    int array[10], array_size;
    ...
    array_size = sizeof(array)/sizeof(int);
    

    请注意,除非它是全局的,否则这只适用于初始化数组的范围,因为如果将它传递给另一个函数,它会衰减为指针。

    希望对你有帮助。

    【讨论】:

    • 与数组是否动态分配无关。这是关于您是否允许数组类型衰减为指针类型。例如,我可以像int (*a)[10] = malloc(sizeof *a) 这样创建一个动态分配的数组,然后使用sizeof *a / sizeof **a 来“确定”元素的数量。无需单独存储尺寸。
    • +1,尽管最好使用sizeof(array)/sizeof(array[0]),这样在底层数组类型发生变化时它仍然可以工作;这种形式还允许您轻松定义宏,例如#define ARRAY_COUNT(a) (sizeof(a)/(sizeof(a[0])).
    • 将其传递给函数也是如此。这完全取决于你如何通过它。
    • @AdamRosenfield:这应该是一个答案。 (然后我可以对其进行编辑以添加缺少的括号...)
    【解决方案4】:

    我认为您应该将尺寸存储在某个地方。

    用于确定数组长度的空终止字符串类型的模型是一个坏主意。例如,获取数组的大小将是 O(N),否则它很容易是 O(1)。

    话虽如此,一个好的解决方案可能是glib's Arrays,如果您需要添加更多项目,它们具有自动扩展的额外优势。

    附:老实说,我没有使用太多 glib,但我认为它是一个(非常)有信誉的库。

    【讨论】:

      猜你喜欢
      • 2020-08-19
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      相关资源
      最近更新 更多