Your "allocate" is absolutely broken.
You are not using the "new" pointer returned by realloc. Even if snake was modified inside Allocate, it will not modify the snake pointer passed in, and thus the calling code's snake will remain the same one it was. Look at how my realloc does things: It doesn't modify the original pointer (but it does free it - although I just realized I'd missed that bit - I'll go back and edit it).
Likewise for MoveAndDraw - it can not change the snake outside of this function.
To modify ANYTHING passed into a function, you must have a pointer to whatever you are mdifying - like the size you are passing to move. To modify a pointer to int to point elsewhere, you need a pointer to pointer to int.
--
Mats