c - 将嵌套结构传递给函数

标签 c function struct

我解决这个问题的方式对我来说似乎不是最佳的。虽然我的代码可以工作,但我觉得我缺少一些可以优化的东西,或者以不同的方式、更简单的方式做的事情。

我的结构:

typedef struct {
    char nom[30];
    char prenom[30];
    double salary;
    double taxes;
} employee;

typedef struct {
    char nom[20];
    employee *employee_list;
    unsigned int nmbr_employees;
} company;

我的代码的重要部分:

int main()
{
    unsigned int nmbr_companies, nmbr_emps, i,j;
    scanf("%u", &nmbr_companies);
    company *company_list = malloc(sizeof(company) * nmbr_companies);

    for(i=0; i <nmbr_companies; i++){
        scanf("%u", &nmbr_emps);
        company_list[i].employee_list = malloc(sizeof(employee) * nmbr_emps);
        for(j=0; j < nmbr_emps; j++){
            calc_netsalary(&company_list[i].employee_list[j]); // [1]
        }
    }

}

double calc_netsalary(employe *emp_list) // [2]
{
    double salary;
    if(emp_list->salary > 75000){
        emp_list->taxes = 750;
        salary=something;
        }
    return salary;
}

[1] 我想知道是否有一种将类似的嵌套结构传递给函数的最佳方法,以及在按照我的方式执行此操作时应该注意的任何陷阱。

[2] 我以为我理解了指针,直到我接触到结构,这一切再次让我感到困惑。任何有关如何在未来处理类似结构而不会挠头和怀疑自己的有见地的评论将不胜感激。

最佳答案

你的代码没问题。我不明白您在理解指针时遇到的问题。结构只是具有已定义(固定)布局的内存块。因此,指向结构的指针指向具有这种固定布局的内存块。当您访问结构体的成员时,编译器只会将该成员的偏移量添加到结构体的基地址上。因此 nmbr_employees 位于 [内存结构开始] + 20 个字符(= 20 字节)+ 1 个整数(= 4 字节)。

你所谓的“列表”实际上是一个数组,所以最好给它起一个这样的名字。 (您分配 nmbr_emps 乘以一 block 已定义布局的内存块,一个接一个地整齐地布局。)由于它们一个接一个地整齐地布局,您可以使用数组表示法对它们进行寻址。

要优化访问,您可以使用指针并编写:

company *pCompany= company_list;
for(i=0; i <nmbr_companies; i++, pCompany++){
    scanf("%u", &nmbr_emps);
    pCompany->employee_list = malloc(sizeof(employee) * nmbr_emps);
    employee *pEmp= pCompany->employee_list;
    for(j=0; j < nmbr_emps; j++, pEmp++){
        // you should now first read-in the emp's data
        calc_netsalary(pEmp); // [1]
    }
}

C 编译器将使用“++”表达式中的结构大小来递增 pCompany 和 pEmp 指针。

关于c - 将嵌套结构传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27771534/

相关文章:

c - IAR 编译器 : using struct with function pointers, 映射文件显示结构中声明的所有函数,无论是否使用函数

c - 如何在 C 中获取未格式化的可变长度字符串中的所有 float ?

R 函数生成不正确的结果

python - 从 python 调用 C++ dll

c - 如果(条件)从链表中删除一个节点

c - 如何在C中声明参数

c - fortran90:寻址内存位置

c - 当我尝试声明包结构时出错?

c++ - Objective C 中的函数/方法!

oop - 什么是方法、属性和功能?