Как мне конвертировать int * в int (* p) (void)? - PullRequest
3 голосов
/ 25 июля 2011

Я пытаюсь сделать это следующим образом:

int (*p)(void);
int *i;
...
p = (int *(void))i;

Но это вызывает синтаксическую ошибку:

error: cast specifies function type

Что здесь не так?

Ответы [ 7 ]

3 голосов
/ 25 июля 2011

i - указатель на целое число, а p - указатель на функцию, возвращающий значение int и не имеющий аргументов Они не совместимы и не могут быть отлиты ни в каком виде, форме или форме.

3 голосов
/ 25 июля 2011

Вы должны уважать ошибку в этом случае.Вы не должны преобразовывать указатель на функцию в указатель типа int или наоборот.Это может привести к неопределенному поведению.

Если вы настаиваете тогда, синтаксис должен быть:

p = (int (*)(void))i;
2 голосов
/ 25 июля 2011

Что говорит компилятор.int (*p)(void) - это объявление указателя на функцию (указатель на функцию, которая возвращает int).int *i; - это объявление скалярного указателя (указатель на int).Вы не можете бросить одно в другое.

1 голос
/ 25 июля 2011

Запись

p = (int (*)(void))i;

Вот пример:

#include <stdio.h>

int f(){
    printf("test\n");
    return 0;
}

int main()
{
    int (*p)(void);
    int *i;

    i = (int*)f;

    p = (int (*)(void))i;

    printf("i=%p\n", i);
    printf("p=%p\n", p);

    ((int (*)(void))i)(); //here, it will call f()

    return 0;
}
1 голос
/ 25 июля 2011

Если вы должны это сделать (и я ни в коем случае не говорю, что вы должны), то:

typedef int (*fp)(void);
int *i;
fp p;
...
p = (fp)((void*)i);
0 голосов
/ 25 июля 2011

Ты не. То есть, если вы не знаете лучше компилятора, что указатель, сохраненный в вашем int *, взят из int (*p)(void) в первую очередь. Как уже говорили другие, этот второй тип является указателем на функцию, которая не принимает параметров и возвращает int. Первый тип - это простой указатель на целое число (или более чем одно целое число, если рассматривается как массив).

0 голосов
/ 25 июля 2011

*i указывает на простое целое число, тогда как *p - указатель на функцию без аргументов , возвращающая целое число. Таким образом, эти два типа имеют совершенно разные типы, и поскольку вы сказали, что p должен указывать на функцию, возвращающую int, вы не можете сказать ей, что она указывает на int.

Тем не менее, вы можете попытаться обернуть оба в союз следующим образом:

union u {
  int *i;
  int (*p)(void);
};

int f(void){
  return 5;
}

int main(int argc, char *argv[]) {
  union u myU;
  int a=6;
  myU.i=&a;
  myU.p=&f;
  return 0;
}

Обратите внимание, что после назначения &f вы можете просто позвонить myU.p(). Но если вы пропустите присвоение &f и вызовете myU.p() впоследствии, это приведет к неопределенному поведению (то есть сбоям программы).

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