Структура, переданная из указателя, показывает неправильные значения - PullRequest
0 голосов
/ 07 мая 2019

У меня есть переменная struct employee, которую я инициализировал в куче, используя malloc.Я передаю эту переменную из указателя, используя *tmp, как показано ниже.Проблема в том, что значения переменной, переданные в функцию, являются неправильными.Я предполагаю, что это связано с указателем, но я не могу найти ошибку.Я думаю, что я подделываю основную информацию об указателях.Для меня я передаю переменную struct employee, указанную *tmp (а не ее адрес, как при передаче указателя) .Не вижу, что там не так.

Если я проверяю значение внутри функции createEmployee() или после ее вызова, они правы, но их нет в isInformationValid(employee e).Если я изменю свой код и передам указатель на функцию, все будет хорошо.

typedef struct employee{
  char nom[MAX_NAME_LEN];
  char prenom[MAX_NAME_LEN];
  unsigned short badge;
  unsigned long secret;
  time_t lastAccess;
} employee;

typedef struct maillon maillon;
struct maillon{
  maillon* next;
  maillon* prev;
  employee* e;
};

typedef struct e_list{
  maillon* m;
} e_list;
[...]
int isInformationsValid(employee e){
  int invalidName = (strlen(e.nom) <= 2 || strlen(e.prenom) <= 2); // Problem here
  int invalidBadge = (e.badge < 1000 || e.badge > 9999); // Problem here. e.badge taken as "25789" when I input "1010"
  if(invalidName) { errno = EPERM; perror("Name length must be > 2"); return -1; }
  if(invalidBadge) { errno = EPERM; perror("Badge must be 4 digits"); return -1; }
  return 0;
}

employee* createEmployee(){
  employee* tmp = calloc(1, sizeof(employee*));
  getString("A man needs a last name : ", tmp->nom, MAX_NAME_LEN);
  getString("A man needs a first name : ", tmp->prenom, MAX_NAME_LEN);
  getDigits("Badge (4 digit) : ", &tmp->badge, "%hu");
  getDigits("Secret : ", &tmp->secret, "%lu");
  time_t t = time(NULL);
  tmp->lastAccess = t;
  if(isInformationsValid(*tmp) == -1){ // Passing addr of the struct
    return NULL;
  }
  return tmp;
}

Что я пропустил?Я сделал что-то не так в какой-либо инициализации, или я упускаю основную вещь о указателях?

Я видел, что у других вопросов по stackoverflow есть похожие вопросы

Единственные ответы, которые я мог прочитать на этих других вопросах, были забытые динамические распределения в куче, что я и делаю (может быть,неправильно).

РЕДАКТИРОВАТЬ

Я делал это неправильно.

1 Ответ

2 голосов
/ 07 мая 2019

Вы выделяете размер employee *, но вам следует выделить размер employee (или *tmp).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...