Как передать аргументы указателям на функции - PullRequest
0 голосов
/ 26 ноября 2018

Я работаю с указателями на функции в c, потому что мне нужен механизм обратного вызова для моей пользовательской библиотеки API.Подводя итог простому примеру:

*userfunction*(SY_msg msg)
{
  /* do something */
};

Размер SY_msg составляет 1024 байта.Поэтому в стеке находится 1024 байта.

Указатель на userfuncion () присутствует в качестве первого элемента в calback_wrapper [].

here is an example of use:
// (...) some code
    SY_msg* msg;
    msg = SYmalloc (sizeof(SY_msg)); /* it takes 1024 bytes in heap */
// (...) some code
    calback_wrapper[0] (*msg); /*  1204 are passed by value  */
    /* during userfunction() execution , 1024 unused bytes are present in the heap */
    free (msg); /* now finally heap is free */
// (...) some code

Но я бы хотелиметь следующее:

// (...) some code
    SY_msg* msg;
    msg = SYmalloc (sizeof(SY_msg)); /* it takes 1024 bytes in heap */
// (...) some code
    memcpy(someplace,msg,sizeof(SY_msg); /*  where "someplace" is a point in the stack referred by the argument of userfunction()  */
    free (msg); /*  heap is free */
    calback_wrapper[0] (*someplace); /* is starts userfunction() execution */
// (...) some code

Можно ли найти «где-то» адрес?Мой компилятор gcc.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

В моем вопросе неверные предположения.Аргумент user function () размещается в стеке ПОСЛЕ вызова функции.Может быть, какой-то "contextxtswich" мог бы решить эту проблему.Пример:

  • Вызовите функцию пользователя ();
  • "contextswich"
  • Освободите кучу
  • "contextswich"
  • Resumeuserfunction ();

Но в любом случае запрашиваются фрагменты кода сборки.

0 голосов
/ 26 ноября 2018

Что мешает вам сделать

// (...) some code
SY_msg msg, * pmsg;
pmsg = SYmalloc (sizeof(SY_msg)); /* it takes 1024 bytes in heap */
// (...) some code using pmsg instead of msg
memcpy(&msg, pmsg, sizeof(SY_msg)); /*  where "someplace" is a point in the stack referred by the argument of userfunction()  */
free (pmsg); /*  heap is free */
calback_wrapper[0] (msg); /* is starts userfunction() execution */
// (...) some code

В приведенном выше примере вы можете заменить

memcpy(&msg, pmsg, sizeof(SY_msg));

на

msg = *pmsg;
...