【问题标题】:Struct passed from pointer shows wrong values从指针传递的结构显示错误的值
【发布时间】:2019-05-07 12:12:36
【问题描述】:

我有一个变量struct employee,我使用malloc 在堆上对其进行了初始化。我使用*tmp 从指针传递这个变量,如下所示。问题是一旦传递给函数的变量值是错误的。我认为这与指针有关,但我找不到错误。我想我忘记了关于指针的基本知识。对我来说,我传递的是*tmp 指向的变量struct employee(而不是传递指针的地址)。看不出那里出了什么问题。

如果我检查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上的其他问题也有类似的问题

我可以阅读其他问题的唯一答案是忘记了堆上的动态分配,这就是我认为我正在做的事情(也许是错误的方式)。

编辑

我做错了。

【问题讨论】:

  • 带调试器检查调用前和调用中的值。
  • @PaulOgilvie 我只能看到它指向一个随机地址,看起来好像没有存储任何东西。
  • 您正在分配employee * 的大小,但您应该分配employee 的大小
  • 这条线是一个大问题,很可能是您遇到麻烦的原因:employee* tmp = calloc(1, sizeof(employee*));。您没有分配足够的内存来保存struct employee,而是分配了足够的内存来保存指向它的指针。根据您的架构,它可能是 4、8 或 2 个字节,可能还不够。使用calloc(1, sizeof *tmp) 或callloc(1, sizeof (employee)) 做你的意思。

标签: c pointers memory struct


【解决方案1】:

您正在分配employee * 的大小,但您应该分配employee(或*tmp)的大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多