Указатель функции в GCC, присвоение адреса

Я столкнулся с тем, что мне совершенно непонятно. Есть прототип функции:

typedef void ( * TMain ) ( void );

и переменная функции:

TMain myFunc = MyFunc;
...
myFunc ();

Это, конечно, работает нормально. Почему бы и нет.

Из MAP-файла я знаю, что "MyFunc" находится по адресу 0x20100. А теперь самое интересное. После присваивания "myFunc = MyFunc;" переменная "myFunc" не содержит значение 0x20100, а 0x20101!

Моя проблема в том, что мне нужно вызвать функцию, адрес которой я знаю из таблицы. Поэтому я думал, что смогу сделать это так

myFunc = ( TMain ) myTable [ 5 ];    // that would be 0x20100
myFunc ();                           // which produces a proper crash

Однако если я это сделаю

myFunc = ( TMain ) ( ( Int8 * ) myTable [ 5 ] + 1 );  
myFunc ();

то это сработает.

Что здесь происходит? Всегда ли я должен добавлять смещение 1 или это более или менее случайно? Или есть лучший (и рабочий) способ решить эту задачу?

Большое спасибо за любую подсказку. Walter

6
задан Blagovest Buyukliev 1 February 2012 в 09:25
поделиться