typedef struct
{
char nickname[32];
int score;
}board;
board leaderboard[1];nick_pos=(short)check_nick(nickname); // check_nick возвращает позицию ника в массиве в случае если таковой имеется и -1 если его нет
if(nick_pos!=-1) now_play=(int)nick_pos;
else {
now_play=sizeof(leaderboard)/sizeof(board)-1;
sprintf(leaderboard[now_play].nickname,"%s",nickname);
int new_size=sizeof(leaderboard)+sizeof(board);
realloc(leaderboard, new_size);
}board должен расширяться?board начал расширяться? board *lB = &leaderboard; //передаем адрес глобального массива в указатель lB
lieB = (board*)realloc(a, newsize *sizeof(board));
if (lieB)
lB = LieB; //если честно я сам не до конца понял для чего создают другой указатель, можно было бы и наверное в старый
else error();
free(lieB); //как я понял уничтожаем именно сам временный указатель, а не то, на что он указывает. Ведь он оказывает туда же
// куда и lB, где хранится наша новая расширенная структура.
realloc вызывать бессмысленно. realloc может быть вызван только для динамически выделенного блока памяти, который массивом не является. board *leaderboard=(board *)malloc(sizeof(board));
...
leaderboard=(board *)realloc(leaderboard, sizeof(leaderboard)+sizeof(board));
now_play=sizeof(leaderboard)/sizeof(board)-1;
sprintf(leaderboard[now_play].nickname,"%s",nickname);
board *leaderboard = malloc(sizeof(board));
А массив выделенный статически сразу занимает в памяти определенный диапазон памяти
и вызов реаллока создаст по адресу массива в памяти дополнительные ячейки, но сам массив от этого не расширится потому что он создан статически
realloc оборвется с ошибкой, т.к. переданный указатель не является динамически выделенным блоком памяти. Никаких действий с памятью произведено не будет.если автор создал бы просто указатель типа leaderboard, то он мог бы его расширять с помощью realloc
realloc можно использовать только для динамической памяти. Следовательно, изначально указатель должен быть инициализирован результатом malloc или calloc.поэтому нужно каждый раз перед расширением создавать его заново с большим количеством ячеек
realloc занимается именно изменением размера выделенного блока памяти. Ничего никуда каждый раз заново выделять не надо. Кстати, в си не обязательно делать явное приведение указателей типа void*.
Также вместо sprintf лучше использовать strcpy