c - 如何将结构传递给参数类型有两个星号的函数

标签 c function pointers struct arguments

让有一个名为 Employee 的结构:

struct Employee
{
    int basicsalary;
    int bonus;
    int netsalary;
};

设函数原型(prototype)如下:

int calc_NetSalary(struct Employee**,int);

让结构体数组的变量在 main 函数中声明如下:

struct Employee emp[100];

让该函数在 main 中调用,如下所示:

for (i = 0; i < n; i++)
{
    emp[i].netsalary = calc_NetSalary(emp[i],n);    // Warning is here
}

让函数定义如下:

int calc_NetSalary(struct Employee** emp,int n)
{
    int i;
    for(i = 0; i < n; i++)
    {
        emp[i]->netsalary = emp[i]->basicsalary + emp[i]->bonus;
    }
    return emp[i]->netsalary;
}

我不知道将什么作为参数传递给需要带有两个星号的参数(代替上面的 emp)的函数。我收到一条警告,因为从不兼容的指针类型传递“calc_NetSalary”的参数 1。我知道这一定是我犯的一个愚蠢的错误,或者我不清楚指针的概念。请帮忙!

最佳答案

扩展我的评论:

calc_netSalary 函数期望 emp 中的数据布局如下:

     +---+                 +-------------+-------+-----------+
emp: |   | emp[0] -------> | basicsalary | bonus | netsalary |
     +---+                 +-------------+-------+-----------+
     |   | emp[1] ----+
     +---+            |    +-------------+-------+-----------+
     |   | emp[2] -+  +--> | basicsalary | bonus | netsalary |
     +---+         |       +-------------+-------+-----------+
      ...          |      
                   |       +-------------+-------+-----------+ 
                   +-----> | basicsalary | bonus | netsalary |
                           +-------------+-------+-----------+

也就是说,每个emp[i]都是一个指向struct Employee实例的指针

但是,main 中的 emp 声明如下所示:

     +-------------+-------+-----------+
emp: | basicsalary | bonus | netsalary | emp[0]
     +-------------+-------+-----------+
     | basicsalary | bonus | netsalary | emp[1]
     +-------------+-------+-----------+
     | basicsalary | bonus | netsalary | emp[2]
     +-------------+-------+-----------+
      ...

也就是说,每个emp[i]都是struct Employee实例

要么是mainemp的声明错误,要么是calc_netSalary的定义错误;它们不能一起工作。为了使 main 中的 empcalc_netSalary 所期望的相匹配,需要通过以下方式之一将其声明为初始化:

struct Employee **emp = malloc( sizeof *emp * 100 );
if ( emp )
  for ( size_t i = 0; i < 100; i++ )
    emp[i] = malloc( sizeof *emp[i] );

struct Employee *emp[100];
for ( size_t i = 0; i < 100; i++ )
  emp[i] = malloc( sizeof *emp[i] );

如果emp确实应该被声明为struct Employee数组,那么calc_netSalary函数需要更改如下:

int calc_netSalary(struct Employee* emp,int n)
{
    int i;
    for(i = 0; i < n; i++)
    {
        emp[i].netsalary = emp[i].basicsalary + emp[i].bonus;
    }
    return emp[i].netsalary;
}

如果您被告知将 emp 声明为 struct Employee 数组,并找到一种将其传递给 calc_netSalary 的方法,这样它将被视为指向 struct Employee指针数组,那么您将面临一项不可能完成的任务。任务中存在严重错误。

编辑

实际上,还有第三种方法可以解决这个问题,但它涉及在 main 中声明第二个数组并将那个作为参数传递:

struct Employee emp[100];
struct Employee *emp2[100];
for ( size_t i = 0; i < 100; i++ )
  emp2[i] = &emp[i];
...
calc_netSalary( emp2, 100 );

但我假设作业要求您使用emp

关于c - 如何将结构传递给参数类型有两个星号的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45303031/

相关文章:

ios - 如何在两个带有参数的函数之间快速传递值或数据?

c++ - 对于 C/C++ 中的数组分配,这些额外的代码是否需要没有错误?

c - 为什么在使用 free() 释放内存时,指针指向的内容没有改变?

c - 重复接受STDIN输入的退出条件

c - 使用指针为 C 中的 3D 数组分配内存?

c++ - 在 C/C++ 中,任何人都可以提供一些使用内联或宏编写小函数的经验法则吗?

objective-c - 内存管理 : NSString's stringWithCString:encoding:

jQuery .click 函数不适用于中键

java - 调用放入数组中的函数

c - 作业 : In C, 如何仅使用指针获取数组的子串?