【问题标题】:Passing an array of a structure between functions在函数之间传递结构数组
【发布时间】:2016-12-15 11:36:45
【问题描述】:

我有一个这样声明的结构“注册”:

typedef struct {
    int TypeID;
    unsigned char InstrumentType[128];
    unsigned char RegTag[128];
    unsigned char Protocol[128];
    int RegNum;
    unsigned char RW[128];
    unsigned char RegisterType[128];
    unsigned char Signed[128];
    unsigned char Inverted[128];
    unsigned char DataType[128];
    int Counts;
} Register;

我有一个名为“Reg[9]”的寄存器数组,并希望创建一个名为“TransferValues”的函数,为数组中每个元素的结构中的所有字段分配值。更新值后,它们将在main() 中单独输出。如何将数组传入和传出这个函数?

【问题讨论】:

  • void yourFunc ( Register *param1) ....int main(void) { Register Reg[9]; yourFunc(Reg);}
  • 一旦返回 main 会保留它的新值吗?我不需要在“yourFunc”末尾返回任何内容?
  • 是的,函数返回时指针指向的数据不会消失。

标签: c arrays pointers structure


【解决方案1】:

您使用语法TransferValues(Reg);Reg 传递给该函数

函数的形式为

/*return type*/ TransferValues(Register* array)

(在函数体中,可以使用array[i]代替*(array + i),其中i是数组的有效索引,可读性更强。)

在 C 中,数组在传递给函数时衰减为指针。请注意,您可能还希望将数组中的元素数量也传递给函数。

【讨论】:

  • Nit:我觉得将指针命名为array "array" 具有误导性,因为它不是数组而是指针。
【解决方案2】:

数组中衰减pointer 时传递给函数,所以你可以简单地调用传递你的数组的函数,就是这样。

使用指针的小例子:

#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <inttypes.h>

typedef struct {
    int32_t TypeID;
    char InstrumentType[128];
} Register;


void func ( Register *reg, size_t n_regs )
{
    for (size_t i=0; i< n_regs; i++)
    {
        reg[i].TypeID = (int32_t)(i);
        sprintf(reg[i].InstrumentType, "Instrument_%zu", i);
    }
}

int main (void)
{
    Register Reg[9] = {{0}};

    func(Reg, sizeof(Reg)/sizeof(Reg[0]));

    for (size_t i=0; i<sizeof(Reg)/sizeof(Reg[0]); i++)
    {
        printf ("Reg[%zu].TypeID = %"PRId32"\n", i, Reg[i].TypeID);
        printf ("Reg[%zu].InstrumentType = %s\n", i, Reg[i].InstrumentType);
    }
}

如您所见,您还应该将要写入传递数组大小的函数传递给函数,以确保不会超出传递数组的范围。

【讨论】:

    【解决方案3】:

    数组自然衰减为指向其第一个元素的指针。当你使用一个数组时,你实际上是在使用一个指针。

    所以解决方案就是让函数接受一个指向结构的指针作为参数。如果事先没有固定和知道元素的数量,那么向函数提供元素的数量也会很有帮助。

    重要的是要知道对函数类型使用类似数组的声明,例如

    void TransferValues(Register regs[9])
    

    void TransferValues(Register regs[])
    

    实际上并没有将regs 声明为一个数组,编译器默默地将regs 转换为一个指针(Register *regs)。这在尝试使用 sizeof 技巧来获取数组中的元素数量时会产生影响。

    对于一个实际的数组,比如

    Register regs[9]
    

    您可以使用sizeof(regs) / sizeof(regs[0]) 来获取数组中的元素数量。这在函数中不起作用,因为您只有一个指针,对指针执行 sizeof 会得到实际指针的大小,而不是它指向的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      相关资源
      最近更新 更多