c - 指向结构的元素

标签 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; 的值作为指针。我知道那不是必需的,但我想那样做。如有任何建议,我将不胜感激。

最佳答案

应该这样做:

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/

相关文章:

c++ - 在C/C++中检测内存IO以进行硬件仿真

c - 为什么 mmap() 比顺序 IO 快?

c - 当我处理信号_handler和主函数中的变量时,如何屏蔽信号

c - 嵌入式 C 程序任务堆栈中未使用的间隙

c - 如何在 Canny 边缘检测器中找到强度梯度

c - 了解 Linux 中的 RS-485

结合陀螺仪和加速度计数据

c - 是否使用 strcpy

c - 按位取余运算符

c - 在C中输入和反转多个字符串?