【问题标题】:Trouble passing struct pointers in C to create a sequential list在 C 中传递结构指针以创建顺序列表时遇到问题
【发布时间】:2013-09-24 15:38:54
【问题描述】:

我在这里定义了一个结构

typedef struct {
char name[10];
int idBadge;
} Employee;

我想使用这个函数调用来填充这个结构的一个实例:

void EmployeeCall (char *name, int badgeNumber, Employee *E){
    E = (Employee *)malloc(sizeof(Employee));
    strcpy(E->name,name);
    E->idBadge = badgeNumber;
}

然后,我想使用这样的调用来检索给定的信息:

int EmployeeBadge (Employee E){
    return(E.idBadge);
}

我从下面的 Main 调用这些函数:

int main(void){
    Employee a;
    int badgeNumber;

    int badgeNumberA = 1028;
    char *namePtrA = "Fred";

    EmployeeCall( namePtrA, badgeNumberA, &a );

    badgeNumber = EmployeeBadge(a);
    printf("%d\n",badgeNumber);

    return 0;
}

当我调用它们时,它们都可以正确编译,但是 EmployeeBadge 的返回值不正确。它返回 int,就好像没有任何东西放入结构中一样; 徽章编号 = 32767

如何创建一个可以通过值和引用传递的结构变量?我是否需要另一个作为指针的 Employee 变量并将 Employee a 分配给它以用于 EmployeeCall 函数?

【问题讨论】:

  • ` E = (Employee *)malloc(sizeof(Student));`???
  • 您可以取消引用 *eint i = employeeBadge(*e); 如果声明为静态,我敢打赌编译器会优化掉不需要的部分——即使 static int employeeBadge(Employee *E) { return E->badgeID; } 至少是同样好的解决方案。

标签: c pointers data-structures struct function-pointers


【解决方案1】:

您的代码不需要分配新员工,请将您的 EmployeeCall 更改为

void EmployeeCall (char *name, int badgeNumber, Employee *E){

    strcpy(E->name,name);
    E->idBadge = badgeNumber;
}

【讨论】:

  • 那么就不需要 malloc 任何额外的内存了吗?那么当我要销毁那个Employee信息时,是否可以使用Free(E)?
  • 这样,你不需要释放(E),因为它是在堆栈中分配的。它的内存会被自动回收。
【解决方案2】:

您的 main 函数已经为 Employee 保留了内存,并且指针“E”将保持在函数的本地。你可以简单地省略malloc;

另一种解决方案是传递一个指向指针的指针并让 CallEmployee 填充:

main()
{
        Employee *e;
        EmployeeCall( ..., &e);
}

void EmployeeCall (char *name, int badgeNumber, Employee **E)
{
   *E = malloc(sizeof(Employee));  // No cast needed
}

【讨论】:

  • 指向指针的指针是我的首选解决方案,即使其他解决方案“有效”。它目前有效,但由于 堆栈溢出,不适用于 100 万员工。
  • 在这个范围内,不需要。
【解决方案3】:

也许是这样

E = (Employee *)malloc(sizeof(Student));

应该是

E = (Employee *)malloc(sizeof(Employee));

但是,既然你在这里传递了员工:

EmployeeCall( namePtrA, badgeNumberA, &a ); // &a is the employee

您只是想删除对 malloc 的调用:

// don't need this E = (Employee *)malloc(sizeof(Student));

【讨论】:

  • 对不起,我已经编辑它是正确的。不相关。
  • 查看关于不需要 malloc 的另一部分,或查看 John 的回答。
  • 这是因为已经分配了内存对吗?
  • 当您说“员工 a;”时这为堆栈上的 Employee 放置了足够的内存。这与使用 malloc 从堆中获取内存不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 2014-05-14
  • 1970-01-01
  • 2013-05-09
  • 2011-03-15
相关资源
最近更新 更多