初始化结构变量

时间:2020-05-03 21:51:58

标签: c struct variadic-functions

我想在varargs中填充整个结构。我知道该结构的所有单个元素都可以用int16_t *x = va_arg(args, int16_t*);填充,但是我正在寻找一种更有效的方法,以便可以使用memset。我试图对整个结构使用相同的代码,如下所示。但这是行不通的。因此,有一种方法可以仅使用一个va_args参数来初始化整个结构,而不是对所有单个元素使用varargs。

typedef struct {
    int16_t x;          
    int16_t y;      
} Coordinate;

void AddValues(int count, ...) {
    va_list args;
    va_start(args, count);

    Coordinate *dec = va_arg(args, Coordinate*);
    *dec.x = 10;
    *dec.y = 5;
    va_end(args);
}

int main() {
    Coordinate cor;
    AddValues(2, &cor);
    printf("x: %d and y: %d\n", cor.x, cor.y);
}

2 个答案:

答案 0 :(得分:2)

va_arg(args, Coordinate)应该是va_arg(args, Coordinate *)

您可以用复合文字分配整个结构:

*va_arg(args, Coordinate *) = (Coordinate) { 10, 5 };

void main()应该是int main(void)

答案 1 :(得分:1)

va_arg宏中使用结构类型是完全合法的。要求是

参数类型应为 type 名称,该名称应指定为 可以获得具有指定类型的对象的指针 只需将*后缀为 type

调用va_arg的结果就是该类型,不是指向该类型的指针。您正在将Coordinate类型的值dec分配给Coordinate*。修复该错误,并相应地调整其余代码,您应该能够使其正常工作。

也:

void main()不正确。使用int main(void)

问题中的代码至少缺少三个必需的#include指令。

您的代码定义了AddValues,但调用了AddValuesOriginal

如果您告诉我们“但这不起作用。”,则需要向我们确切说明如何。在您的问题中包含所有错误消息,格式为代码。