繁体   English   中英

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

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

我将函数void Assign_numbers传递给void Adding 当我将其更改为一个指针和编译,所述第一阵列值返回从相同的值number.avoid 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;
}

Adding函数中,变量ptr指向单个结构,实质上是单个元素的数组。 例如,当执行ptr[1]您尝试访问此单元素数组中的第二个元素,该元素超出范围,将导致未定义的行为

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


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

指针的类型(在您的情况下为struct Numbers )定义数组中元素的偏移量。 例如,如果你有一些类型的数组T使用的a[i]将意味采取值T从地址a + i * sizeof(T)或simplier。

注意:确实, a[i]将被转换为*(a + i) ,这就是i[a]运行良好的原因。 请参见使用数组,为什么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方法像数组一样遍历结构的成员吗? 例如。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM