Синтаксис записи значений C
Всем привет, наткнулся я на одну статейку в интернете по работе с памятью на C++, где обнаружил такую строчку кода:
*(PDWORD)&MyFunc = VTable[1];
Где VTable - массив типа DWORD. Зная Microsoft, у них есть готовые имена для типов данных WIN32, так например, DWORD - unsigned long int; PDWORD - указатель на DWORD.
И так в этой строчке кода я вижу что: 1)берётся адрес функции MyFunc 2)происходит преобразование типа в PDWORD 3)Запись значения из массива VTable
Вопрос такой, для чего знак астериск (*) в начале строки? Куда происходит запись значения из массива, в адрес или указатель?
Что это вообще за синтаксис где стоит знак астериск в начале, но при этом происходит преобразование в тип указатель на DWORD, зачем это указывать два раза?
Ответы (2 шт):
- Это код на
C - Это плохой, непереносимый код на
C, потому что наx64это работать нормально не будет - Это пример наглого TypePunning
Как работает в общем случае
Берем указатель куда-то - &Myfunc
Теперь внаглую говорим, что это, оказывается, указатель на DWORD - (PDWORD)&Myfunc
Потом разыменовываем это, уже как указатель на DWORD - *(PDWORD)&Myfunc
Пишем туда свое значение типа DWORD - *(PDWORD)&Myfunc = VTable[1];
Обратите внимание
& возле переменной имеет в C только один смысл - дай мне указатель на это. Ссылок в С просто нет.
Так ещё делают для установки константного значения поля структуры, так как обычное присваивание в этом случае вызовет ошибку компилляции:
struct {
const int a;
} st;
/* error: */
st.a = 10;
/* no error: */
*(int*)&st.a = 10;