将值初始化为结构

时间:2011-03-22 04:37:49

标签: c

  struct mac_filter
    {
        char ether_dhost[6];
        char ether_shost[6];
        short ether_type;
    };

    struct packet_filter
    {
        struct mac_filter mac;
    };

    main()
    {
    struct packet_filter test;
    test.mac= NULL;
    }

我得到了

error: incompatible types when assigning to type ‘struct mac_filter’ from type ‘void *’

这里我想将mac_filter的所有成员函数初始化为零,有没有办法将它们设置为零而不是将每个成员函数初始化为零

6 个答案:

答案 0 :(得分:2)

您的结构包含实际的struct mac_filter,而不是指向其中的指针。您无法为其分配NULL

如果你想要一个指针,你的结构看起来像:

struct packet_filter
{
    struct mac_filter *mac;
};

要使用它,你需要malloc()内存,或者指定它。

如果您只想将结构清零,可以使用memset并将指针传递给结构:

memset(&test.mac, 0, sizeof (struct mac_filter));

答案 1 :(得分:2)

实际上,memset将它们全部归零会更快,然后填充以后可用的值。

但是,当您知道所有值时,我建议您使用C99 initialization

struct packet_filter test = {
    .mac = (struct mac_filter) {
        .ether_dhost = {0, 0x11, 0x22, 0x33, 0x44, 0x55},
        .ether_shost = {0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa};
    },
};

您未设置的任何值都会自动初始化为零。在这种情况下,我将mac.ether_type保留为0

请注意,这种初始化非常受欢迎,无论是在编译时还是运行时初始化C样式的跳转表,以及其他类型的稀疏填充数组,或者设置的索引/成员字段都非常具体。

答案 2 :(得分:1)

您可以使用memset:

memset(&test.mac, 0, sizeof (test.mac));

请参阅the manual page of the memset function

答案 3 :(得分:1)

也许我没有正确理解你的问题但默认初始化正在做你想要的:

int main(void)
{
    struct mac_filter test = { 0 };
}

默认情况下,初始化将递归的所有字段设置为0的“正确”形式。在大多数情况下,这相当于memset,但您永远不会知道您的目标架构作为专业。

如果你想分配给那个部分(这与初始化不同)你可以使用C99中的“复合文字”:

test.mac = (const packet_filter){ 0 };
顺便说一下,你发布的代码完全是虚假的。您的声明类型不正确,您对main的定义是荒谬的。请发布尽可能正确的代码,以便我们专注于问题的实际问题。

答案 4 :(得分:0)

在C

中使用memset
memset(&test.mac, 0, sizeof (struct mac_filter));

答案 5 :(得分:-1)

最好将其定义为全局变量。全局变量的默认值为零。