Возможно указатель функции или проблема приведения. Точно сказать не могу - PullRequest
3 голосов
/ 17 августа 2010

Что происходит в этом коде?Я не понимаю этот кодПохоже, он выполняет кастинг или использует указатели на функции, но я не уверенБуду признателен, если кто-то может мне помочь.Спасибо.

const char string[]="Hello!";

int main()   
{

    (*(void (*)()) string)(); //Obviously, my problem is this line :)

    return 0;
}

Ответы [ 2 ]

4 голосов
/ 17 августа 2010

Во-первых, давайте используем cdecl , чтобы объяснить внутреннюю тарабарщину:

$ cdecl
cdecl> explain (void (*)())
cast unknown_name into pointer to function returning void

Таким образом, (void (*)()) string преобразует string в указатель на функцию. Затем указатель на функцию разыменовывается для вызова базовой функции. Строка эквивалентна

void (*fp)() = (*(void (*)()) string)();
(*fp)();

Это (на большинстве машин) пытается выполнить "Hello!" как машинный код. Это может привести к сбою на компьютерах с виртуальной памятью, поскольку данные часто помечаются как неисполняемые. Если он не потерпит крах, он вряд ли что-то сделает связным. В любом случае это бесполезный код.

Единственное, чему здесь нужно научиться, это то, что инструмент cdecl может быть полезен для понимания или написания сложных типов C и объявлений.

3 голосов
/ 17 августа 2010

void (*)() - это тип указателя на функцию. (void (*)()) string приводит string к такому указателю на функцию. Оставшиеся (* ...)() в выражении разыменовывают этот результирующий указатель функции и пытаются вызвать функцию.

Поскольку нет функции, на которую указывает этот указатель, а есть только строка "Hello!", Это не приведет к каким-либо полезным результатам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...