将嵌套结构传递给函数

时间:2015-01-04 23:31:43

标签: 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]我以为我理解了指针,直到我进入结构,这一切都让我感到困惑。任何有关如何处理类似结构的有见地的评论,而不会挠头和第二次猜测我自己将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

你叫什么&#34; list&#34;实际上是一个数组,所以最好给它这样一个名字。 (你用一个定义的布局分配nmbr_emps次内存块,一个接一个地整齐排列。)因为它们一个接一个地整齐排列,你可以使用数组符号来解决它们。

要优化访问权限,可以使用指针并写入:

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编译器将在&#34; ++&#34;中增加pCompany和pEmp指针的结构大小。表达式。