fillhash() does not modify the array passed as third parameter, so in your loop
for (i = 1; Tabring.key[0]; i++)
fillhash(RINGTAB, i, Tabring.key); // <- Here
Tabring.key is not changed inside the loop and (depending on the initial value of Tabring.key[0]) the loop is not executed at all or it is executed indefinitely.
As you initialized key with "" the loop will not be executed. If you use any other key the loop will run forever.
EDIT: regarding optimization, the compiler knows key = "", so it also knows the loop won't be executed and it can wipe the loop and fillhash(), because it isn't called. In fact even inittables() can be optimized away. This decreases file size and increases speed, but make debugging troublesome, because the code you want to debug isn't there. So always debug unoptimized programs.