我想使用以下代码将用户输入复制到堆上的结构中。我知道它不完整,但这对我的问题并不重要。
#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;
的值作为指针。我知道那不是必需的,但我想那样做。如有任何建议,我将不胜感激。
最佳答案
应该这样做:
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;
// ...
};
字符数组和指向字符的指针是非常相似的东西。但在第一种情况下,每次创建 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)
。
关于c - 指向结构的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4519654/