Код компилируется, потому что переменная существует после ее объявления.И эта часть только что объявила: u8x8_i2c_cmdinfo* cmdinfo
.
Вы не удивитесь, если это сработает, верно?
u8x8_i2c_cmdinfo* cmdinfo;
cmdinfo = malloc(sizeof(cmdinfo));
Имейте в виду, что хотя ваш код компилируется нормально, онимеет неприятную ошибкуВы выделяете место под размер указателя, скорее всего, не то, что вы хотите сделать.