指向结构的元素

时间:2010-12-23 14:34:08

标签: c

我想使用以下代码将用户输入复制到堆上的结构中。我知道这是不完整的,但这对我的问题并不重要。

#include "7.1.h"
#include <stdio.h>
#include <stdlib.h>

int main ()

{
    struct Employee emp;
    struct Employees* emps[3];

    for ( int i = 1; i < 2; i ++)
    {
        printf("Please type in the emplooyes data./n Firstname:");
            scanf("%s", emp.first);

        printf("Please type in the emplooyes data./n Lastname:");
            scanf("%s", emp.last);

        printf("Please type in the emplooyes data./n Title:");
            scanf("%s", emp.title);

        printf("Please type in the emplooyes data./n Salary:");
            scanf("%d", emp.salary);

        emps[i] = createEmployee(char*, char*, char*, int);
    }

}

我的问题与代码emps[i] = createEmployee(char*, char*, char*, int);有关。我不知道如何将函数createEmployee()作为指针赋予struct Employee emp;的值。我知道这不是必要的,但我想这样做。我会感谢任何建议。

3 个答案:

答案 0 :(得分:2)

这应该这样做:

emps[i] = createEmployee(emp.first, emp.last, emp.title, emp.salary);

...但是如果你稍微改变了你的功能,那么使用它会好得多:

emps[i] = createEmployee(emp);

您的Employee结构可以这样定义:

struct Employee {
  char first[256];
  //...
};

...在这种情况下,'first'是一个数组。或者,它可以定义为

struct Employee {
  char *first;
  // ...
};

一个字符数组和一个指向char的指针是非常相似的野兽。但在第一种情况下,每次创建Employee时,您将自动为名字分配256个字符。在第二种情况下,您必须手动分配内存,并在复制时适当地复制它,并记住也要删除它。

说出您的createEmployee方法:

Employee *createEmployee(char * first, char * last, char * title, int salary);

如果你采用上面Employee结构的第一种形式,你可以这样做:

struct Employee *createEmployee(char * first, char * last, char * title, int salary) {
  struct Employee *retVal = (struct Employee *)malloc(sizeof(struct Employee));
  strcpy(retVal->first, first);
  strcpy(retVal->last, last);
  // etc
  return retVal;
}

在第二种情况下,您可以这样做:

struct Employee *createEmployee(char * first, char * last, char * title, int salary) {
  struct Employee *retVal = (struct Employee *)malloc(sizeof(struct Employee));
  retVal->first = strdup(first);
  retVal->last = strdup(last);
  // etc
  return retVal;
}

请注意,第二种情况使删除(和复制)非常棘手。

void deleteEmployee(struct Employee *emp) {
  free(emp->first);
  free(emp->last);
  // etc
  free(emp);
}

...但是对于第一种形式,您只需要free(emp)

答案 1 :(得分:2)

这应该有效:

emps[i] = createEmployee(emp.first, emp.last, emp.title, emp.salary);

您必须考虑emp数据结构是您的函数的本地数据(对于本例main)。如果您在其他任何地方使用emp,这可能会导致非常奇怪的错误,因为一旦函数返回,为emp分配的数据将会消失 - 因此使用来自emp的任何数据,例如{{1 }和emp.first,可能会导致一些问题。

解决这个问题的一种方法是动态分配emp.last,并在任何地方传递它的引用 - 通常是这样做的。

另一种快速的hacky方式是动态分配将丢失的内容,例如你的指针:

emp

strdup()会复制你给它的字符串,它将使用emps[i] = createEmployee(strdup(emp.first), strdup(emp.last), strdup(emp.title), emp.salary); (堆)存储它,这样当函数返回时它就不会消失。

答案 2 :(得分:0)

首先,

可能存在拼写错误
  struct Employees // the s

您可以简单地将emp记录作为指针传递

  emps[i] = createEmployee( &emp );

你必须分配一个新的结构,然后返回给调用者

  struct Employee *createEmployee(struct Employee *p)
  {
     struct Employee *newe = malloc(sizeof(struct Employee));
     memcpy(newe, p, sizeof(struct Employee));
     return newe;
  }

假设结构包含char [x]而不是char *

未经过测试。