I have an array of structs that I created somewhere in my program.
Later, I want to iterate through that, but I don't have the size of the array.
How can I iterate through the elements? Or do I need to store the size somewhere?
I have an array of structs that I created somewhere in my program.
Later, I want to iterate through that, but I don't have the size of the array.
How can I iterate through the elements? Or do I need to store the size somewhere?
You can store the size somewhere, or you can have a struct with a special value set that you use as a sentinel, the same way that '\0' indicates the end of a string.
If the size of the array is known at compile time, you can use the structure size to determine the number of elements.
struct foo fooarr[10];
for(i = 0; i < sizeof(fooarr) / sizeof(struct foo); i++)
{
do_something(fooarr[i].data);
}
If it is not known at compile time, you will need to store a size somewhere or create a special terminator value at the end of the array.
It depends. If it's a dynamically allocated array, that is, you created it calling malloc, then as others suggest you must either save the size of the array/number of elements somewhere or have a sentinel (a struct with a special value, that will be the last one).
If it's a static array, you can sizeof it's size/the size of one element. For example:
int array[10], array_size;
...
array_size = sizeof(array)/sizeof(int);
Note that, unless it's global, this only works in the scope where you initialized the array, because if you past it to another function it gets decayed to a pointer.
Hope it helps.
I think you should store the size somewhere.
The null-terminated-string kind of model for determining array length is a bad idea. For instance, getting the size of the array will be O(N) when it could very easily have been O(1) otherwise.
Having that said, a good solution might be glib's Arrays, they have the added advantage of expanding automatically if you need to add more items.
P.S. to be completely honest, I haven't used much of glib, but I think it's a (very) reputable library.
Sorry for asking instead of replying, but if you create the array in question, why don't you also keep track of the number of elements in it?
You already have some alternate suggestions earlier, btw. Or you can encapsulate your array further in a struct along with a counter variable and update that counter as your array size changes.
Regards.