我想使用以下代码将用户输入复制到堆上的结构中。我知道这是不完整的,但这对我的问题并不重要。
#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;
的值。我知道这不是必要的,但我想这样做。我会感谢任何建议。
答案 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 *
。
未经过测试。