迭代一个C数组

And*_*son 32 c arrays

我有一个结构数组,我在程序中的某处创建.

后来,我想迭代一遍,但我没有数组的大小.

我如何迭代元素?或者我需要在某处存储大小?

Var*_*der 46

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

struct foo fooarr[10];

for(i = 0; i < sizeof(fooarr) / sizeof(struct foo); i++)
{
  do_something(fooarr[i].data);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 确实,但我宁愿使用 `sizeof(fooarr[0])` 或 `sizeof(*fooarr)` 而不是 `sizeof(struct foo)` (5认同)
  • 阿格你快点!! 我正在编辑我的回复大声笑:) (3认同)

Dav*_*ler 22

您可以在某处存储大小,或者您可以使用具有您用作标记的特殊值集的结构,就像'\ 0'表示字符串结尾的方式相同.

  • 我认为遵循以null结尾的字符串模型是一个坏主意 (7认同)
  • +1我通常使用指向结构的指针,以便我可以肯定`NULL`是一个独特的哨兵. (4认同)

Ant*_*oMO 13

这取决于.如果它是一个动态分配的数组,也就是你创建它调用malloc,那么就像其他人建议你必须保存数组的大小/元素的数量或者有一个sentinel(一个具有特殊值的结构,这将是最后一个).

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

int array[10], array_size;
...
array_size = sizeof(array)/sizeof(int);
Run Code Online (Sandbox Code Playgroud)

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

希望能帮助到你.

  • +1,虽然稍微更喜欢做`sizeof(array)/ sizeof(array [0])`,这样如果底层数组类型改变它仍然可以工作; 此表单还允许您轻松定义宏,例如`#define ARRAY_COUNT(a)(sizeof(a)/(sizeof(a [0]))`. (7认同)
  • 这与是否动态分配数组无关。关于允许数组类型衰减为指针类型的知识。例如,我可以创建一个动态分配的数组,例如`int(* a)[10] = malloc(sizeof * a)`,然后使用`sizeof * a / sizeof ** a`来“确定”元素的数量。无需单独存储大小。 (3认同)