У меня есть структура данных, которая выглядит следующим образом:
#include <stdbool.h>
.
.
.
typedef struct Input {
uint8_t pin; /**< Pin associated with this input */
bool state, /**< Current pin state */
last_state; /**< Pin state last time we checked */
} Input;
Я инициализирую структуру данных следующим образом:
Input *input = (Input *)malloc(sizeof(Input));
input->pin = 0;
input->state = false;
input->last_state = false;
Я компилирую код с помощью avr-gcc
7.2.0 и запускаю код с помощью simulavr ("SimularAVR 1.2dev") и присоединяюсь к нему с помощью avr-gdb
.
Когда я распечатываю структуру данных в gdb
сразу после инициализации, я вижу это:
(gdb) p *input
$1 = {pin = 0 '\000', state = false}
Обратите внимание, что элемент last_state
не отображается. Кроме того, если я установлю один из существующих членов, то, похоже, они на самом деле ссылаются на одно и то же местоположение:
(gdb) set input->pin=123
(gdb) p *input
$8 = {pin = 123 '{', state = 123}
Если я изменю тип данных state
и last_state
с bool
на, скажем, uint8_t
, вот так ...
typedef struct Input {
uint8_t pin; /**< Pin associated with this input */
uint8_t state, /**< Current pin state */
last_state; /**< Pin state last time we checked */
} Input;
... тогда все отображается правильно:
(gdb) p *input
$1 = {pin = 0 '\000', state = 0 '\000', last_state = 0 '\000'}
Что здесь происходит? Это ошибка в gdb
? В simulavr
? Что-то другое? Обратите внимание, что сам код работает правильно при развертывании на целевом микроконтроллере (attiny85); это полностью проблема отладки / симуляции.