Указывая на элемент структуры - PullRequest
1 голос
/ 23 декабря 2010

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

#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 ]

2 голосов
/ 23 декабря 2010

Это должно работать:

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

Вы должны учитывать, что структура данных emp является локальной для вашей функции (в данном случае main).Это может привести к очень странным ошибкам, если вы используете emp где-либо еще, потому что данные, выделенные для emp, исчезнут после того, как функция вернется, поэтому используйте любые данные из emp, такие как emp.first и emp.last, может вызвать некоторые проблемы.

Один из способов решения этой проблемы - динамическое выделение emp и передача ссылки на него в любом месте - обычно это происходит так.

Другим быстрым хакерским способом будет динамическое выделение вещей, которые будут потеряны, например, ваши указатели:

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

strdup () будет дублировать строку, которую вы ей дадите, и этосохраните его, используя malloc() (куча), чтобы оно не исчезло, когда функция вернется.

2 голосов
/ 23 декабря 2010

Это должно сделать это:

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;
  // ...
};

Массив символов и указатель на символ очень похожи на зверей.Но в первом случае вы автоматически выделяете 256 символов для имени при каждом создании Employee.Во втором случае вы должны выделить память вручную и соответствующим образом продублировать ее при копировании, а также не забудьте удалить ее.

Скажем, ваш метод 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).

0 голосов
/ 23 декабря 2010

Во-первых, в

  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 *.

Не проверено.

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