给定一个结构数组,如何将结构一个成员的所有值传递给一个函数

时间:2020-10-07 03:48:06

标签: c

给出一个结构数组,有没有办法传递

emp[0].hourly_wage, emp[1].hourly_wage, emp[2].hourly_wage, emp[3].hourly_wage, emp[4].hourly_wage

将其作为浮点数数组的功能?

是否可以传递仅包含“ hourly_wage”成员而不包含“ OT”成员的浮点数数组,而不必只是将值复制到单独的浮点数数组中,然后将其传递给函数。

struct employee
{
    float hourly_wage;
    float OT;
};

struct employee emp[5];

3 个答案:

答案 0 :(得分:1)

不,您不能,但是您可以创建另一个 pointers 数组,该数组指向结构数组中的那个成员,并将该指针数组传递给函数。

实施:

#include <stdio.h>
  
#define ARR_SZ 5

struct employee
{
        float hourly_wage;
        float OT;
};

void test_fun(float **arr) {
        for (int i = 0; i < ARR_SZ; ++i) {
                printf ("%f ", *arr[i]);
        }
        printf ("\n");
}

int main(void) {
        struct employee emp[ARR_SZ];

        for (int i = 0; i < ARR_SZ; ++i) {
                emp[i].hourly_wage = 2.0f;  // dummy value
                emp[i].OT = 1.0f;    // dummy value
        }

        float *hw_arr[ARR_SZ];

        for (int i = 0; i < ARR_SZ; ++i) {
                hw_arr[i] = &(emp[i].hourly_wage);
        }

        test_fun(hw_arr);

        return 0;
}

或者只是将结构数组传递给函数并访问该成员:

#include <stdio.h>
  
#define ARR_SZ 5

struct employee
{
        float hourly_wage;
        float OT;
};

void test_fun(struct employee *arr) {
        for (int i = 0; i < ARR_SZ; ++i) {
                printf ("%f ", arr[i].hourly_wage);
        }
        printf ("\n");
}

int main(void) {
        struct employee emp[ARR_SZ];

        for (int i = 0; i < ARR_SZ; ++i) {
                emp[i].hourly_wage = 2.0f;  // dummy value
                emp[i].OT = 1.0f;    // dummy value
        }

        test_fun(emp);

        return 0;
}

答案 1 :(得分:0)

否。

最接近的可能是:

float a[10];
memcpy(a, emp, sizeof(a));

或者:

void foo(float *a) { ... }
foo((float *) emp);

但这可能是未定义的行为,因为它依赖于每个struct的末尾没有打包(在这种情况下可能没有打包,但普遍不正确-参见the answers here),并且无论如何都会给出数据顺序不正确。

答案 2 :(得分:0)

不可能。

数组要求数组元素位于连续的内存中(请注意:成员之间可能存在填充,但此处不相关)。

在您的情况下,emp的内存布局如下:

addrX (i.e. emp)         :  float // emp[0].hourly_wage
addrX + 1 * sizeof(float):  float // emp[0].OT
addrX + 2 * sizeof(float):  float // emp[1].hourly_wage
addrX + 3 * sizeof(float):  float // emp[1].OT
addrX + 4 * sizeof(float):  float // emp[2].hourly_wage
addrX + 5 * sizeof(float):  float // emp[2].OT
...

并且没有办法将其变成

addrY                    :  float // emp[0].hourly_wage
addrY + 1 * sizeof(float):  float // emp[1].hourly_wage
addrY + 2 * sizeof(float):  float // emp[2].hourly_wage
...

没有从第一个数组复制到另一个数组。

通常,要做的是传递整个结构数组,即传递struct employee 指针,然后从结构中访问所需的内容。