If you run (your version):
find . -name \*.[ch] -exec ctags {} \;
then findexecutes ctagsonce for each file found. The file is tagsoverwritten every time, and only the tags for the last file remain.
find ctags . :
find . -name \*.[ch] -exec ctags {} +
( trojanfoe , ):
ctags $(find . -name \*.[ch])