[си] приведение типа (char*) &(char*)

feliks28

Разбираюсь в функции FormatMessage. Из приведенного там примера заинтересовали две строчки:
LPVOID lpMsgBuf;
FormatMessage(..., (LPTSTR) &lpMsgBuf, 0, NULL );
Т.е. для ANSI (и т.к. мне не нужна универсальность типа можно переписать в
char* lpMsgBuf;
FormatMessageA(..., (char*) &lpMsgBuf, 0, NULL );
Оно компилируется и нормально работает, но у меня возникает сильное непонимание того, что есть (char*) &(char*) и как оно работает?

Maurog

(char*) &(char*) и как оно работает?
неправильно понял что надо понять
надо понять, что значит (char*) & lpMsgBuf
это взяли адрес переменной lpMsgBuf и привели его к указателю на char.

feliks28

Все равно не понимаю
У меня в мозгу картинка памяти выглядит так (lpMsgBuf.gif, 5Kb)
Т.е. если мы преобразовываем <&lpMsgBuf> к указателю на char, то мы указатель <lpMsgBuf> преобразовываем в char?

kokoc88

Т.е. если мы преобразовываем <&lpMsgBuf> к указателю на char, то мы указатель <lpMsgBuf> преобразовываем в char?
Нет. Мы просто преобразуем void** к char*.

feliks28

Я понимаю что мы делаем(хотя вроде мы в контексте задачи char** в char* преобразуем. или как? но не понимаю как оно работает
Как память после такого преобразования выглядеть будет?

kokoc88

Как память после такого преобразования выглядеть будет?
Точно так же. Такое преобразование типов не меняет содержимое памяти.

feliks28

Хм. Но функция-то судя по ее объявлению ожидает указатель на char, и насколько я понимаю (опять же из ее объявления) будет туда писать.
Причем получится что char'ы она будет писать прямо по адресу lpMsgBuf, а не в lpMsgBuf[0] и т.п.

kokoc88

Но функция-то судя по ее объявлению ожидает указатель на char, и насколько я понимаю (опять же из ее объявления) будет туда писать.
Нет. Ей передаётся флаг, и она обратно переприводит типы.

feliks28

А, вроде понял. FORMAT_MESSAGE_ALLOCATE_BUFFER ?
Тогда, если бы можно было заранее узнать требуемый размер и выделять память самостоятельно, то эти танцы с (char*) & не нужны будут?
Эхх, исходники б
Спасибо, за разьяснения. А то, совсем я запутался.
Оставить комментарий
Имя или ник:
Комментарий: