I was working on some particle systems and this was the only way I could figure out to set up the arrays:
vertices = malloc(sizeof(point3D) * 4 * [particles count]);
textures = malloc(sizeof(point2D) * 4 * [particles count]);
Try starting with an estimated particle count and
malloc-ing an array of that size. Then, if your particle count needs to increase, use
realloc to re-size the existing buffer. That way, you minimize the amount of allocate/free operations that you are doing.
If you want to make sure that you don't waste memory, you can also keep a record of the last 100 (or so) particle counts. If the max particle count out of that set is less than (let's say) 75% of your current buffer size, then resize the buffer down to fit that smaller particle count.