Невозможно присвоить NULL указателю - PullRequest
0 голосов
/ 26 мая 2019

У меня странная проблема, которую я не могу объяснить с присвоением NULL указателя.Это моя тестовая структура:

typedef struct
{
    uint8_t *buffer_pntr;
    uint8_t size;
    uint8_t some_other_stuff;
}my_struct_t;

void my_function (my_struct_t *handler)
{
    memset(&handler,0,sizeof(handler);
    handler->buffer_pntr=NULL;
}

void main(void)
{
   my_struct_t test;
   my_function(&test);
}

Я хочу вызвать my_function, чтобы установить мою структуру в известное состояние, потому что я объявляю свою структуру внутри main, чтобы она стала локальной, а состояние локальной переменной неизвестно.Проблема в том, что назначение NULL приводит к сбою системы (Hardfault на cortex-m4), и я также не уверен, является ли хорошей практикой использование memset в struct с указателем.Удаление присваивания NULL из my_function и использование test.buffer_pntr = NULL вне my_function решает проблему.

Ответы [ 2 ]

4 голосов
/ 26 мая 2019

Проблема здесь:

memset(&handler,0,sizeof(handler));

Я предполагаю, что вы хотите обнулить структуру, но handler является указателем, поэтому, когда вы говорите &handler, вы берете указатель на указательи обнуление его.Так эффективно вы делаете

handler = NULL;

А затем разыменование указателя вызывает проблему.Если вы хотите обнулить структуру, вам нужно сделать

memset(handler,0,sizeof(*handler));

Тогда, конечно, вам не нужно устанавливать указатель внутри на NULL отдельно.

3 голосов
/ 26 мая 2019
memset(&handler,0,sizeof(handler));

должно быть

memset(handler,0,sizeof(*handler));

Поскольку handler уже является указателем, то sizeof(handler) - это размер указателя, вам нужно передать размер объекта, на который указывает handler.

...