У меня есть переменная 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 есть похожие вопросы
Единственные ответы, которые я мог прочитать на этих других вопросах, были забытые динамические распределения в куче, что я и делаю (может быть,неправильно).
РЕДАКТИРОВАТЬ
Я делал это неправильно.