Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
遍历C数组_C_Arrays - Fatal编程技术网

遍历C数组

遍历C数组,c,arrays,C,Arrays,我在程序的某个地方创建了一个结构数组 稍后,我想遍历它,但我没有数组的大小 如何遍历元素?或者我需要将大小存储在某个地方吗?您可以将大小存储在某个地方,或者您可以使用一个具有特殊值集的结构作为哨兵,就像“\0”表示字符串的结尾一样。如果数组的大小在编译时已知,则可以使用结构大小来确定元素的数量 struct foo fooarr[10]; for(i = 0; i < sizeof(fooarr) / sizeof(struct foo); i++) { do_something(f

我在程序的某个地方创建了一个结构数组

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


如何遍历元素?或者我需要将大小存储在某个地方吗?

您可以将大小存储在某个地方,或者您可以使用一个具有特殊值集的结构作为哨兵,就像“\0”表示字符串的结尾一样。

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

struct foo fooarr[10];

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

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

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

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

int array[10], array_size;
...
array_size = sizeof(array)/sizeof(int);
请注意,除非它是全局的,否则这只在初始化数组的范围内有效,因为如果将它传递给另一个函数,它将衰减为指针


希望对你有所帮助。

我想你应该把尺码放在某个地方

以null结尾的字符串类型的确定数组长度的模型是一个坏主意。例如,获取数组的大小将是O(N),否则很容易得到O(1)

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


另外,老实说,我没有使用太多的glib,但我认为它是一个(非常)著名的库。

+1我通常使用指向结构的指针,这样我就可以确定
NULL
是一个独特的哨兵。我认为遵循以NULL结尾的字符串模型是一个不好的选择idea@hasenj:我同意,除非您知道每次都必须遍历整个数组,否则哨兵可以稍微澄清代码。sentinel的问题在于,最终可能会出现O(N)行为,而O(1)可能会这样做,但并不总是意识到这一点。这与数组是否被动态分配无关。这是关于您是否允许数组类型衰减为指针类型。例如,我可以创建一个动态布局分配数组,如下所示
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:这应该是一个答案。(然后我可以编辑它以添加缺少的括号…)确实如此,但我宁愿使用
sizeof(fooarr[0])
sizeof(*fooarr)
sizeof(struct foo)