fk0, легенда (23.12.2008 18:00, просмотров: 2511)
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]