Ошибка компиляции c программы при сортировке динамического массива структур на vs

Есть задача:

Описать структуру с именем EMPLOYEE, содержащую следующие поля:

NAME — Имя работника

SURNAME- Фамилия работника

POST — название занимаемой должности

DATE— дата поступления на работу день-месяц-год

  1. Написать программу, выполняющую следующие действия

Ввод с клавиатуры данных в массив company, состоящий из структур типа EMPLOYEE

Вывод работников, с сортировкой по фамилии

Возможность добавления сотрудников

Возможность вывода на экран сотрудников с сортировкой по стажу работы

Возможность поиска сотрудников по фамилии

Написал код в repl.it, там все работает, а вот на vs выдает ошибку при шагах

  1. Изначально добавить 2 пользователя
  2. Добавить еще 2 пользователя из меню
  3. Отсортировать по фамилии
#include <stdlib.h>
#include <string.h>

typedef struct EMPLOYEE {
  char *Name;
  char *Surname;
  char *Post;
  int dd, mm, yyyy, exp;
} employee_t;
void freeShopArray(struct EMPLOYEE **employer, unsigned size) {
  unsigned i;
  for (i = 0; i < size; i++) {
    free((*employer)[i].Name);
    free((*employer)[i].Surname);
    free((*employer)[i].Post);
  }
  free(*employer);
}
int name_cmp(const void * a, const void * b) {
  return strcmp(((employee_t*)a)->Surname, ((employee_t *)b)->Surname);
}
int exp_cmp(const void * a, const void *b){
    return ((employee_t*)a)->exp - ((employee_t*)b)->exp;
}

int main(void) {
  struct EMPLOYEE *company = NULL;
  unsigned size;
  char buffer[128];
  int i;
  int switch_1;
  int switcher = 0;
  printf("Введите кол-во добавляемых сотрудников: ");
  scanf("%d", &size);
  company = (struct EMPLOYEE *)malloc(size * sizeof(struct EMPLOYEE));
  for (i = 0; i < size; i++) {
    fgets(buffer, 2, stdin);
    printf("Имя: ");
    fgets(buffer, 127, stdin);
    company[i].Name = (char *)malloc(strlen(buffer) + 1);
    strcpy(company[i].Name, buffer);
    printf("Фамилия: ");
    fgets(buffer, 127, stdin);
    company[i].Surname = (char *)malloc(strlen(buffer) + 1);
    strcpy(company[i].Surname, buffer);
    printf("Должность: ");
    fgets(buffer, 127, stdin);
    company[i].Post = (char *)malloc(strlen(buffer) + 1);
    strcpy(company[i].Post, buffer);
    printf("Дата поступления (ДД,ММ,ГГГГ): ");
    scanf("%d", &company[i].dd);
    scanf("%d", &company[i].mm);
    scanf("%d", &company[i].yyyy);
    company[i].exp =
        ((((2022 - company[i].yyyy) * 12) + ((12 - company[i].mm))) * 30 +
         company[i].dd);
  }
  while (1) {
    printf("\nВыберите пункт меню:\n1)Вывод работников с сортировкой по "
           "фамилии\n2)Добавление сотрудников\n3)Вывод сотрудников с "
           "сортировкой по стажу работы\n4)Вывод сотрудника по "
           "фамилии\n5)Выход из программы\n");
    scanf("%d", &switch_1);
    switch (switch_1) {
    case 1:
      qsort(company, size, sizeof(employee_t), name_cmp);
      for (i = 0; i < size; i++) {
        printf("\nИмя: %sФамилия: %sДолжность: %sДата поступления: %d:%d:%d\n", company[i].Name, company[i].Surname, company[i].Post,company[i].dd, company[i].mm, company[i].yyyy);
      }
      break;
    case 2:
      fgets(buffer, 2, stdin);
      size++;
      company = realloc(company, size * sizeof(struct EMPLOYEE));
      printf("Имя: ");
      fgets(buffer, 127, stdin);
      company[i].Name = (char *)malloc(strlen(buffer) + 1);
      strcpy(company[i].Name, buffer);
      printf("Фамилия: ");
      fgets(buffer, 127, stdin);
      company[i].Surname = (char *)malloc(strlen(buffer) + 1);
      strcpy(company[i].Surname, buffer);
      printf("Должность: ");
      fgets(buffer, 127, stdin);
      company[i].Post = (char *)malloc(strlen(buffer) + 1);
      strcpy(company[i].Post, buffer);
      printf("Дата поступления (ДД,ММ,ГГГГ): ");
      scanf("%d", &company[i].dd);
      scanf("%d", &company[i].mm);
      scanf("%d", &company[i].yyyy);
      company[i].exp =
          ((((2022 - company[i].yyyy) * 12) + ((12 - company[i].mm))) * 30 +
           company[i].dd);
      break;
    case 3:
      qsort(company, size, sizeof(employee_t), exp_cmp);
      for (i = 0; i < size; i++) {
      printf("\nИмя: %sФамилия: %sДолжность: %sДата поступления: %d:%d:%d\n", company[i].Name, company[i].Surname, company[i].Post,company[i].dd, company[i].mm, company[i].yyyy);
      }      
      break;
    case 4:
      printf("Введите фамилию сотрудника: ");
      fgets(buffer, 2, stdin);
      fgets(buffer, 127, stdin);
      for (i = 0; i < size; i++) {
        if (strcmp(buffer, company[i].Surname) == 0) {
          printf(
              "\nИмя: %sФамилия: %sДолжность: %sДата поступления: %d:%d:%d\n",
              company[i].Name, company[i].Surname, company[i].Post,
              company[i].dd, company[i].mm, company[i].yyyy);
        }
      }
      break;
    case 5:
      freeShopArray(&company, size);
      return (0);
    default:
      printf("\nНеверный ввод\n");
      break;
    }
  }
}```

Ответы (1 шт):

Автор решения: AlexGlebe

в пункте 2 добавления сотрудника используется переменная i и вы ей не присваиваете индекс size, что приводит к постоянному записыванию данных в одно и тоже место и остальные места памяти остаются со случайными мусорными данными.
Дальше обращение к случайной памяти приводит к ошибкам.

решение :

case 2 :
  i = size ;
  ..
→ Ссылка