如何将参数传递给函数指针

时间:2018-11-26 11:53:39

标签: c pointers dereference call-by-value

我正在使用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 :(得分:0)

使您无法做的事情

// (...) 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;

答案 1 :(得分:0)

我的问题有错误的假设。 用户function()的参数在函数调用之后立即分配到堆栈中。 也许某种“上下文”可以解决这个问题。 示例:

  • 调用userfunction();
  • “上下文三明治”
  • 释放堆
  • “ contextswich”
  • 恢复userfunction();

但是在任何情况下,都要求提供汇编代码段。