【问题标题】:Passing an argument in the function to turn struct values into an array在函数中传递参数以将结构值转换为数组
【发布时间】:2016-06-27 13:47:19
【问题描述】:

我将函数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;
}

【问题讨论】:

  • 你为什么想到将结构体作为一个数组来访问?你遇到过这样的例子吗?
  • 只是一个实验。我正在学习c。

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


【解决方案1】:

指针的类型(在您的情况下为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?

【讨论】:

    【解决方案2】:

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

    您根本无法将标准 C 中的结构视为数组。


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-17
      • 2019-03-22
      • 1970-01-01
      相关资源
      最近更新 更多