Предлагаю ничью :) действительно, ругается (мои прежние неудачные попытки обусловлены несоблюдением всех условий) на
mys.next = (MyStruct*)0;
в моделях памяти, где указатель на данные 24 бита (LARGE и COMPACT).
Вместе с тем расследование показало, что если не применять type-cast, то компилер генерит верные инструкции для присвоения и сравнения (viva ReAl :):
volatile int * ptr, *ptr2;
void main(void)
{
ptr = 0;
if (ptr == ptr2)
{
CO 000002 4200 R 69 MOV A, #bnksym _ptr
CO 000004 6F11 70 MOV ADB, A
CO 000006 D0 71 MOVN A, #0
CO 000007 1C 72 EXTW
CO 000008 0671BF0000 R 73 MOVL ADB:_ptr, A
74 ._LINE 0, 18
75 ;;;; if (ptr == ptr2)
CO 00000D 06719F0000 R 76 MOVL A, ADB:_ptr
CO 000012 06707F0000 R 77 CMPL A, ADB:_ptr2
CO 000017 F107 78 BNE L_23
Еще есть что сказать.
У нас есть несколько проектов, где используется больше 64К ОЗУ.
В этих случаях модель памяти все равно SMALL или MEDIUM (т.е. указатели в ОЗУ 16 бит), но большие буферы (например, для self-programming) объявлены в far области с соответствующим приведением 0 к типу __far void *.
Все-таки работа с 24бит указателями заметно замедляет систему по сравнению с 16бит указателями.