ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
26 июля
143198
fk0, легенда (23.12.2008 18:00, просмотров: 2469)
PICC18, v9.51pl2 ОПЯТЬ!!! typedef unsigned magic_t; struct __freelist { magic_t magic; size_t sz; struct __freelist *nx; char c; } dprintf("sizeof(size_t)=%u, sizeof(struct __freelist)=%u\n", sizeof(size_t), sizeof(struct __freelist)); dprintf("NONX=%u, sizeof(struct __freelist*)=%u, sizeof(magic_t)=%u\n", NONX, sizeof(struct __freelist*), sizeof(magic_t)); dprintf("disp of nx = %u\n", &(((struct __freelist*)0)->nx)); dprintf("disp of c = %u\n", &(((struct __freelist*)0)->c)); А ЭТО ВЫВОД: sizeof(size_t)=2, sizeof(struct __freelist)=8 NONX=6, sizeof(struct __freelist*)=2, sizeof(magic_t)=2 disp of nx = 4 disp of c = 7 Понятно? sizeof(указатель) в RAM у PIC18 конечно равен 2 (байта). А вот если это указатель на структуру, то после него будет обязательно выравнивание на НЕЧЁТНЫЙ байт. Оно, в принципе, с точки зрения языка C вполне допустимо. Проблема только в том, что ни один вменяемый компилятор себя так не ведёт (минус байт памяти потерян) и готовый код, прекрасно работающий везде, здесь отказывается. Нет, понятно, это КРИВОЙ код, потому что он на выравнивании на i386 тоже йопается, но это отдельная история.
[ZX]