在函数之间传递一个结构体数组

3

我有一个声明为以下形式的结构体"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()中单独输出。我如何传递这个数组到该函数并从该函数返回数组?

void yourFunc ( Register *param1) ....int main(void) { Register Reg[9]; yourFunc(Reg);} - LPs
一旦返回主函数,它是否会保留其新值?在“yourFunc”结尾处我不需要返回任何东西吗? - Mst137
1
是的,指针所指向的数据在函数返回时不会消失。 - Some programmer dude
3个回答

4

您需要使用以下语法将Reg传递给该函数:TransferValues(Reg);

该函数的格式为:

/*返回类型*/ TransferValues(Register* array)

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

在C中,当数组作为参数传递给函数时,它们会退化为指针。请注意,您可能还想将数组中元素的数量传递给函数。


注意:我觉得将指针命名为“array”是具有误导性的,因为它不是一个数组而是一个指针。 - alk

3

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

因此,解决方案很简单,只需将该函数作为参数接受一个指向该结构体的指针。如果元素数量不固定或事先已知,则提供给函数也将非常有帮助。

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

void TransferValues(Register regs[9])

或者

void TransferValues(Register regs[])

实际上并没有声明regs为一个数组,编译器会自动将regs转换为指针(Register *regs)。这会影响使用sizeof技巧来获取数组元素数量的结果。

对于实际的数组,例如

Register regs[9]

您可以使用 sizeof(regs) / sizeof(regs[0]) 来获取数组中元素的数量。但是在函数中,这种方法不起作用,因为您只有一个指针,对指针使用 sizeof 将会给出指针本身的大小而不是它所指向的数据的大小。


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);
    }
}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接