Синтаксис записи значений C

Всем привет, наткнулся я на одну статейку в интернете по работе с памятью на C++, где обнаружил такую строчку кода:

*(PDWORD)&MyFunc = VTable[1];

Где VTable - массив типа DWORD. Зная Microsoft, у них есть готовые имена для типов данных WIN32, так например, DWORD - unsigned long int; PDWORD - указатель на DWORD.

И так в этой строчке кода я вижу что: 1)берётся адрес функции MyFunc 2)происходит преобразование типа в PDWORD 3)Запись значения из массива VTable

Вопрос такой, для чего знак астериск (*) в начале строки? Куда происходит запись значения из массива, в адрес или указатель?

Что это вообще за синтаксис где стоит знак астериск в начале, но при этом происходит преобразование в тип указатель на DWORD, зачем это указывать два раза?


Ответы (2 шт):

Автор решения: gbg
  1. Это код на C
  2. Это плохой, непереносимый код на C, потому что на x64 это работать нормально не будет
  3. Это пример наглого TypePunning

Как работает в общем случае

Берем указатель куда-то - &Myfunc

Теперь внаглую говорим, что это, оказывается, указатель на DWORD - (PDWORD)&Myfunc

Потом разыменовываем это, уже как указатель на DWORD - *(PDWORD)&Myfunc

Пишем туда свое значение типа DWORD - *(PDWORD)&Myfunc = VTable[1];

Обратите внимание

& возле переменной имеет в C только один смысл - дай мне указатель на это. Ссылок в С просто нет.

→ Ссылка
Автор решения: Dmitry Safonov

Так ещё делают для установки константного значения поля структуры, так как обычное присваивание в этом случае вызовет ошибку компилляции:

struct {
    const int a;
} st;

/* error: */
st.a = 10;

/* no error: */
*(int*)&st.a = 10;
→ Ссылка