在函数之间传递结构数组

时间:2016-08-09 12:16:14

标签: c arrays pointers structure

我有一个结构“Register”,声明如下:

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()中单独输出。如何将数组传递给此函数?

3 个答案:

答案 0 :(得分:4)

您使用语法Reg

TransferValues(Reg);传递到该函数中

该功能的格式为

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

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

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

答案 1 :(得分:3)

数组自然衰落到指向第一个元素的指针。使用数组时,实际上是在使用指针。

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

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

void TransferValues(Register regs[9])

void TransferValues(Register regs[])

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

对于实际数组,例如

Register regs[9]

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

答案 2 :(得分:3)

数组衰减传递给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);
    }
}

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