Dallas has too many sports icons to count . <| sep |> Did you ever get email or it just arrived at your house ? <| sep |> How is your karma doing ? <| sep |> You are right that using void for simple arrays is a very bad idea . It hurts locality , adds significant memory overhead and is clumsy to work with . On the macro route , there are two typical approaches with or without token concatenation . For complex data structures such as hash table and tree , it is usually necessary to use token concatenation . For arrays , token concatenation is overkilling . I would advise to use plain macros . gives an implementation . It does not do error checking , but you get the basic idea . The following is an example about how to use the header # include kvec . h int mainvoid kvectint array kvinitarray kvpushint , array , 10 append kvaint , array , 20 5 dynamically expand the array kvAarray , 20 4 kvdestroyarray return 0