Passing function pointers as arrays of chars

Discussion in 'C Programming' started by Olaf Dietrich, Oct 22, 2008.

  1. I may just be temporarily (hopefully ...) stupid, but how can
    I pass a function pointer between functions using an array of
    (signed/unsigned) chars (in a standard-conforming way)?


    E.g.:

    I have a function: int (*func)(double, int).

    Now I'd like to store the "address" of this function
    in an array (of sufficient size) of chars, e.g. in
    char func_addr[100]. (How can I do this?)

    And finally I would like to use this address in another
    function pointer:
    new_func = (int (*)(double, int)) func_addr.

    This doesn't work - gcc complains: "ISO C forbids conversion
    of object pointer to function pointer type".


    Is there a way to store the data that constitutes the function
    pointer in an array of chars (that need not have the size of
    an object pointer)? And then to re-interpret this sequence of
    bytes again as a function pointer?


    Thanks for any suggestions
    Olaf
     
    Olaf Dietrich, Oct 22, 2008
    #1
    1. Advertising

  2. Olaf Dietrich

    James Kuyper Guest

    Olaf Dietrich wrote:
    > I may just be temporarily (hopefully ...) stupid, but how can
    > I pass a function pointer between functions using an array of
    > (signed/unsigned) chars (in a standard-conforming way)?
    >
    >
    > E.g.:
    >
    > I have a function: int (*func)(double, int).
    >
    > Now I'd like to store the "address" of this function
    > in an array (of sufficient size) of chars, e.g. in
    > char func_addr[100]. (How can I do this?)



    char func_addr[sizeof func];
    memcpy(func_addr, &func, sizeof func);

    > And finally I would like to use this address in another
    > function pointer:
    > new_func = (int (*)(double, int)) func_addr.


    memcpy(&new_func, func_addr, sizeof new_func);

    > This doesn't work - gcc complains: "ISO C forbids conversion
    > of object pointer to function pointer type".


    That's because you're trying to convert func_addr, which in this context
    decays into a pointer to the first char of that array, into a pointer to
    a function. What you want it to do is interpret the contents of that
    array as if it were a pointer to a function. The syntax for such a
    conversion (were it safe) would be:

    new_func = *(int (**)(double, int)) func_addr;

    This converts func_addr from a pointer to an array of char into a
    pointer to a function pointer, then dereferences that pointer, obtaining
    a function pointer. This is not, unfortunately, a safe approach to
    use, because there's no guarantee that func_addr is correctly aligned to
    hold such a pointer. You could guarantee correct alignment if func_addr
    were a pointer to a dynamically allocated array of char, or if func_addr
    were part of a union with a the appropriate function pointer type.
     
    James Kuyper, Oct 22, 2008
    #2
    1. Advertising

  3. James Kuyper <>:
    > Olaf Dietrich wrote:
    >
    >> Now I'd like to store the "address" of this function
    >> in an array (of sufficient size) of chars, e.g. in
    >> char func_addr[100]. (How can I do this?)

    >
    > char func_addr[sizeof func];
    > memcpy(func_addr, &func, sizeof func);
    >
    >> And finally I would like to use this address in another
    >> function pointer:

    >
    > memcpy(&new_func, func_addr, sizeof new_func);


    How obvious and simple ... (and it even works).

    Thank you very much for your help
    Olaf
     
    Olaf Dietrich, Oct 22, 2008
    #3
  4. On 22 Oct, 13:10, (Olaf Dietrich) wrote:

    > I may just be temporarily (hopefully ...) stupid, but how can
    > I pass a function pointer between functions using an array of
    > (signed/unsigned) chars (in a standard-conforming way)?


    why do you want to do this? Some sort of callback function?
    It's best avoided if you can.

    <snip>

    --
    Nick Keighley
     
    Nick Keighley, Oct 22, 2008
    #4
  5. Olaf Dietrich

    Guest

    On Oct 22, 3:31 pm, James Kuyper <> wrote:
    > Olaf Dietrich wrote:
    > > I may just be temporarily (hopefully ...) stupid, but how can
    > > I pass a function pointer between functions using an array of
    > > (signed/unsigned) chars (in a standard-conforming way)?

    >
    > > E.g.:

    >
    > > I have a function: int (*func)(double, int).

    >
    > > Now I'd like to store the "address" of this function
    > > in an array (of sufficient size) of chars, e.g. in
    > > char func_addr[100]. (How can I do this?)

    >
    > char func_addr[sizeof func];
    > memcpy(func_addr, &func, sizeof func);


    How will this work since the conversion between void * and a function
    pointer needs not to be meaningful? (6.3.2.3)
    (notice the memcpy call)
    Also, while the first line is possible for function pointers, it's not
    for function designators;
    This is correct:

    void (*fp)(void);
    char foo[sizeof fp];

    This is incorrect:

    char foo[sizeof strcpy];

    Because it violates the constraint in 6.5.3.4
     
    , Oct 22, 2008
    #5
  6. Olaf Dietrich

    Guest

    wrote:
    > On Oct 22, 3:31 pm, James Kuyper <> wrote:
    > > Olaf Dietrich wrote:

    ....
    > > > I have a function: int (*func)(double, int).

    > >
    > > > Now I'd like to store the "address" of this function
    > > > in an array (of sufficient size) of chars, e.g. in
    > > > char func_addr[100]. (How can I do this?)

    > >
    > > char func_addr[sizeof func];
    > > memcpy(func_addr, &func, sizeof func);

    >
    > How will this work since the conversion between void * and a function
    > pointer needs not to be meaningful? (6.3.2.3)
    > (notice the memcpy call)


    No such conversion is performed by this code. The only pointers being
    converted are func_addr and &func, in the memcpy() call that you refer
    to. Both of those are pointers to objects. func_addr is pointer to a
    char object, and &func is a pointer to a function pointer object.
    Neither one is a pointer to a function. func itself is a pointer to a
    function, but func is NOT being converted to void*.

    > Also, while the first line is possible for function pointers, it's not
    > for function designators;


    The question I answered was specifically about func, which is a
    function pointer object. Function pointer values have to be stored in
    a function pointer object before this approach can be used.
     
    , Oct 22, 2008
    #6
  7. Olaf Dietrich

    Guest

    On Oct 22, 8:50 pm, wrote:
    > wrote:
    > > On Oct 22, 3:31 pm, James Kuyper <> wrote:
    > > > Olaf Dietrich wrote:

    > ...
    > > > > I have a function: int (*func)(double, int).

    >
    > > > > Now I'd like to store the "address" of this function
    > > > > in an array (of sufficient size) of chars, e.g. in
    > > > > char func_addr[100]. (How can I do this?)

    >
    > > > char func_addr[sizeof func];
    > > > memcpy(func_addr, &func, sizeof func);

    >
    > > How will this work since the conversion between void * and a function
    > > pointer needs not to be meaningful? (6.3.2.3)
    > > (notice the memcpy call)

    >
    > No such conversion is performed by this code. The only pointers being
    > converted are func_addr and &func, in the memcpy() call that you refer
    > to. Both of those are pointers to objects. func_addr is pointer to a
    > char object, and &func is a pointer to a function pointer object.
    > Neither one is a pointer to a function. func itself is a pointer to a
    > function, but func is NOT being converted to void*.


    Could you give me the type of func?
    You say it's a pointer to a function pointer.
    Does it mean it's T (**)()?
    If so, then your code works and I apologise, however... (read below)

    > > Also, while the first line is possible for function pointers, it's not
    > > for function designators;

    >
    > The question I answered was specifically about func, which is a
    > function pointer object. Function pointer values have to be stored in
    > a function pointer object before this approach can be used.


    Here you say func is a function pointer object, which contradicts what
    you said before.

    After some test, I realize where I was wrong:

    & doesn't have an effect with function designators, however it does
    have for function pointers.
    Therefore, your code is correct and I was wrong. :)
     
    , Oct 22, 2008
    #7
  8. Olaf Dietrich

    Guest

    wrote:
    > On Oct 22, 8:50 pm, wrote:
    > > wrote:
    > > > On Oct 22, 3:31 pm, James Kuyper <> wrote:
    > > > > Olaf Dietrich wrote:

    > > ...
    > > > > > I have a function: int (*func)(double, int).

    ....
    > > ... and &func is a pointer to a function pointer object.

    ....
    > Could you give me the type of func?


    See above. It's the first line of the message you were responding to.

    > You say it's a pointer to a function pointer.


    No, I said that &func is a pointer to a function pointer. func itself
    is the function pointer that &func points at.

    > Does it mean it's T (**)()?


    No, &func has type int (**)(double,int).

    ....
    > > The question I answered was specifically about func, which is a
    > > function pointer object.

    ....
    > Here you say func is a function pointer object, which contradicts what
    > you said before.


    The first statement was about &func, the second statement was about
    func.

    > & doesn't have an effect with function designators, however it does
    > have for function pointers.
    > Therefore, your code is correct and I was wrong. :)


    Well, that would explain the confusion.
     
    , Oct 22, 2008
    #8
  9. Olaf Dietrich

    Default User Guest

    wrote:


    > > > > > I have a function: int (*func)(double, int).


    > Could you give me the type of func?


    You already had it.



    Brian
     
    Default User, Oct 22, 2008
    #9
  10. Olaf Dietrich

    Guest

    On Oct 22, 10:44 pm, "Default User" <> wrote:
    > wrote:
    > > > > > > I have a function: int (*func)(double, int).

    > > Could you give me the type of func?

    >
    > You already had it.


    Yes, but afterwards I explained in my post my confusion.
    I have the habbit of writing my message as I read the other article,
    which I think makes my messages somewhat unclear, so I'm trying to
    stop doing it.
     
    , Oct 22, 2008
    #10
  11. Nick Keighley <>:
    > On 22 Oct, 13:10, (Olaf Dietrich) wrote:
    >
    >> I may just be temporarily (hopefully ...) stupid, but how can
    >> I pass a function pointer between functions using an array of
    >> (signed/unsigned) chars (in a standard-conforming way)?

    >
    > why do you want to do this? Some sort of callback function?


    I was trying to pass a pointer to a C function (used for
    non-linear numerical fitting) between Tcl commands. I can
    easily pass arbitrary binary data as arrays of (unsigned)
    chars using the available library "procedures" such as
    Tcl_SetByteArrayObj(), but it's not possible to pass
    function pointers directly (without defining any additional
    new types of Tcl objects etc.)


    > It's best avoided if you can.


    It's sort of quick and dirty, but it works (using
    memcpy as suggested by James Kuyper).


    Olaf
     
    Olaf Dietrich, Oct 23, 2008
    #11
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Kosio

    Floats to chars and chars to floats

    Kosio, Sep 16, 2005, in forum: C Programming
    Replies:
    44
    Views:
    1,327
    Tim Rentsch
    Sep 23, 2005
  2. Replies:
    3
    Views:
    389
    Eric Sosman
    Jul 20, 2007
  3. Hongyu
    Replies:
    9
    Views:
    948
    James Kanze
    Aug 8, 2008
  4. cerr

    pointers, pointers, pointers...

    cerr, Apr 7, 2011, in forum: C Programming
    Replies:
    12
    Views:
    714
  5. M.Posseth

    receiving ??? chars instead of "special" chars

    M.Posseth, Nov 15, 2004, in forum: ASP .Net Web Services
    Replies:
    3
    Views:
    267
    Dan Rogers
    Nov 16, 2004
Loading...

Share This Page