инициализация значения в структуре - PullRequest
0 голосов
/ 22 марта 2011
  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 ]

2 голосов
/ 22 марта 2011

Это на самом деле быстрее memset их всех к нулю, а затем заполнить значения, когда они станут доступны позже.

Однако я рекомендую использовать C99 инициализации , когда вы знаете всезначения:

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 голосов
/ 22 марта 2011

Ваша структура содержит фактический struct mac_filter, а не указатель на него. Вы не можете присвоить NULL ему.

Если вы хотите указатель на один, ваша структура будет выглядеть так:

struct packet_filter
{
    struct mac_filter *mac;
};

Чтобы использовать его, вам нужно malloc() памяти или назначить ему указатель.

Если вы просто хотите обнулить свою структуру, вы используете memset и передаете указатель на вашу структуру:

memset(&test.mac, 0, sizeof (struct mac_filter));
1 голос
/ 22 марта 2011

Возможно, я не правильно понимаю ваш вопрос, но инициализация по умолчанию делает именно то, что вы хотите:

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

По умолчанию эта инициализация рекурсивно устанавливает все поля в «правильную» форму 0.В большинстве случаев это эквивалентно memset, но вы никогда не знаете, что ваша целевая архитектура имеет в качестве специальностей.

И если вы хотите присвоить этой части (это нечто иное, чем инициализация), вы можете использовать "составной литерал "от C99:

test.mac = (const packet_filter){ 0 };

Кстати, код, который вы разместили, является полностью поддельным.Тип вашей декларации неверен, а ваше определение main смешно.Пожалуйста, отправьте код, который является максимально правильным, чтобы мы могли сконцентрироваться на реальной проблеме для вопроса.

1 голос
/ 22 марта 2011

Вы можете использовать memset:

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

См. страницу руководства по функции memset .

0 голосов
/ 22 марта 2011

лучше вы определите это как глобальную переменную.и значение глобальной переменной по умолчанию равно нулю.

0 голосов
/ 22 марта 2011

Использовать memset в C

memset(&test.mac, 0, sizeof (struct mac_filter));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...