【发布时间】:2009-10-20 23:17:25
【问题描述】:
我在程序的某处创建了一个结构数组。
稍后,我想遍历它,但我没有数组的大小。
如何遍历元素?还是我需要将尺寸存储在某个地方?
【问题讨论】:
我在程序的某处创建了一个结构数组。
稍后,我想遍历它,但我没有数组的大小。
如何遍历元素?还是我需要将尺寸存储在某个地方?
【问题讨论】:
如果数组的大小在编译时已知,则可以使用结构体大小来确定元素个数。
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)
您可以将大小存储在某处,或者您可以拥有一个带有特殊值集的结构体用作标记,就像\0 指示字符串的结尾一样。
【讨论】:
NULL 是一个独特的哨兵。
这取决于。如果它是一个动态分配的数组,也就是说,您创建它时调用 malloc,那么正如其他人建议的那样,您必须在某处保存数组的大小/元素数量或有一个哨兵(一个具有特殊值的结构,这将是最后一个)。
如果它是一个静态数组,你可以调整它的大小/一个元素的大小。例如:
int array[10], array_size;
...
array_size = sizeof(array)/sizeof(int);
请注意,除非它是全局的,否则这只适用于初始化数组的范围,因为如果将它传递给另一个函数,它会衰减为指针。
希望对你有帮助。
【讨论】:
int (*a)[10] = malloc(sizeof *a) 这样创建一个动态分配的数组,然后使用sizeof *a / sizeof **a 来“确定”元素的数量。无需单独存储尺寸。
sizeof(array)/sizeof(array[0]),这样在底层数组类型发生变化时它仍然可以工作;这种形式还允许您轻松定义宏,例如#define ARRAY_COUNT(a) (sizeof(a)/(sizeof(a[0])).
我认为您应该将尺寸存储在某个地方。
用于确定数组长度的空终止字符串类型的模型是一个坏主意。例如,获取数组的大小将是 O(N),否则它很容易是 O(1)。
话虽如此,一个好的解决方案可能是glib's Arrays,如果您需要添加更多项目,它们具有自动扩展的额外优势。
附:老实说,我没有使用太多 glib,但我认为它是一个(非常)有信誉的库。
【讨论】: