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的所有成员函数初始化为零,有没有办法将它们设置为零而不是将每个成员函数初始化为零
答案 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)
答案 3 :(得分:1)
也许我没有正确理解你的问题但默认初始化正在做你想要的:
int main(void)
{
struct mac_filter test = { 0 };
}
默认情况下,初始化将递归的所有字段设置为0
的“正确”形式。在大多数情况下,这相当于memset
,但您永远不会知道您的目标架构作为专业。
如果你想分配给那个部分(这与初始化不同)你可以使用C99中的“复合文字”:
test.mac = (const packet_filter){ 0 };
顺便说一下,你发布的代码完全是虚假的。您的声明类型不正确,您对main
的定义是荒谬的。请发布尽可能正确的代码,以便我们专注于问题的实际问题。
答案 4 :(得分:0)
答案 5 :(得分:-1)
最好将其定义为全局变量。全局变量的默认值为零。