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

时间:2016-03-12 07:39:55

标签: c arrays pointers struct pass-by-reference

我将我的函数void Assign_numbers传递给了void Adding。当我将其更改为指针并对其进行编译时,第一个数组值将从number.a中的void Assign_numbers返回相同的值。从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;
}

2 个答案:

答案 0 :(得分:3)

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

你根本无法像标准数组一样处理标准C中的结构。

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

答案 1 :(得分:3)

指针的类型(在您的情况下为struct Numbers)定义数组中元素的偏移量。例如,如果您拥有某种类型T的数组,则使用a[i]意味着从地址T 获取a + i * sizeof(T)的值或更简单。< / p>

注意:要成为真a[i],我们会将*(a + i)转换为i[a],这就是struct Numbers *ptr正常工作的原因。请参阅With arrays, why is it the case that a[5] == 5[a]?问题。

现在您拥有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

另一种方法是使用<body>。例如,请参阅C method for iterating through a struct's members like an array?