在函数中传递参数以将结构值转换为数组

Passing an argument in the function to turn struct values into an array

我将函数 void Assign_numbers 传递给了 void Adding。当我将其更改为指针并编译它时,第一个数组值 returns 与 void Assign_numbersnumber.a 的值相同。数组中从 ptr[1] 开始的另一个值给出了一个完全不同的数字。你能帮我一下吗,这样数组就可以输出其他分配的数字了。请不要更改格式。

#include <stdlib.h>
#include <stdio.h>

#define Max 6

struct Numbers
{
    double a,b,c,d,e,f;
};

void Adding(struct Numbers *ptr)

void Assign_numbers()
{
    struct Numbers number;

    number.a=45.78;
    number.b=81.45;
    number.c=56.69;
    number.d=34.58;
    number.e=23.57;
    number.f=78.35;

    Adding(&number);
}

void Adding(struct Numbers *ptr)
{
    int i =0;

    for(i;i<Max;i++)
    {
        ptr[i];
        printf("%.2f\n",ptr[i]);
    }
}

int main()
{
     Assign_numbers();
     return 0;
}

Adding函数中,变量ptr指向一个单一结构,本质上是一个单一元素的数组。当你这样做时ptr[1] 您尝试访问此单元素数组中的 second 元素,这超出了范围,将导致 未定义的行为 .

根本无法像对待数组一样对待标准 C 中的结构。


虽然有 hacks。例如,使用一个联合结构作为一个成员,一个数组作为另一个成员,但这依赖于编译器不在结构成员之间添加任何填充。既不便携也不推荐。

指针的类型(在您的例子中是 struct Numbers)定义了数组中元素的偏移量。例如,如果您有某种类型的数组 T 使用 a[i] 将意味着 从地址 a + i * sizeof(T) 获取 T 的值或更简单。

注意:实际上 a[i] 会转换为 *(a + i),这就是 i[a] 工作正常的原因。请参阅 With arrays, why is it the case that a[5] == 5[a]? 问题。

现在你有 struct Numbers *ptr 并使用 ptr[0] 使其成为 *(ptr + 0 * sizeof(struct Numbers)),这将引导你进入记忆中的结构。然而,使用 ptr[1] 会导致您进入 *(ptr + 1 * sizeof(struct Numbers)),但内存中此地址上没有数据,这会导致未定义的行为。

你想要做的是用 double* 遍历你的结构,例如

void Assign_numbers()
{
    struct Numbers number;

    number.a=45.78;
    number.b=81.45;
    number.c=56.69;
    number.d=34.58;
    number.e=23.57;
    number.f=78.35;

    Adding((double*)&number);
}

void Adding(double* ptr)
{
    int i = 0;
    for(i; i < Max; i++)
    {
        ptr[i];
        printf("%.2f\n",ptr[i]);
    }
}

打印

45.78
81.45
56.69
34.58
23.57
78.35

另一种方法是使用union。例如,参见 C method for iterating through a struct's members like an array?