void CheckPressedKey(char** area, char** area_buf, int row, int col)
{
struct Ships ships;
Структура ships -- автоматическая, существует на стеке только во время выполнения этой функции, создаётся (с неопределёнными значениями полей) при входе в неё и исчезает при выходе.
Если ты хотел, чтобы она сохранялась между вызовами этой функции, нужно было добавить static:
static struct Ships ships;
. С этим изменением будет работать так как ты задумал, но наличие статических переменных в функциях -- не очень хорошая практика. Обычно лучшим решением является передача таких данных в функцию как параметра, например:
void CheckPressedKey(char** area, char** area_buf, int row, int col, struct Ships *ships)