(void *) casting

Discussion in 'C Programming' started by James Leddy, Jun 30, 2003.

  1. James Leddy

    James Leddy Guest

    Hello,

    I know you can cast a void pointer to an int, char, or any other type of
    pointer, but can you do the reverse, cast an int or char pointer as a void
    pounter?

    This is the blowfish encipher algorithim and I need to make xl and xr void
    because they come from a char * buffer, but I need them as unsigned longs.

    void encipher_dword(void *xl, void *xr)
    {
    unsigned long *temp;
    unsigned long *al, *ar;
    int i;

    al = (unsigned long *) xl;
    ar = (unsigned long *) xr;
    for (i = 0; i < N; i++) {
    *al = *al ^ P;
    *ar = f(al) ^ *ar;
    SWAP(al, ar, temp);
    }
    SWAP(al, ar, temp);

    *ar = *ar ^ P[N];
    *al = *al ^ P[N + 1];
    xl = (void *) al; //can I do this?
    xr = ar; //should I do it like this?
    }

    I thought of another solution being to swap the actual values in al and ar,
    insted of just the addresses, but I thought that would be slower
    implementation.

    Thanks,

    --
    -J. Leddy (a.k.a. iustitia)
    James Leddy, Jun 30, 2003
    #1
    1. Advertising

  2. James Leddy

    Jack Klein Guest

    On Mon, 30 Jun 2003 15:25:14 GMT, James Leddy <>
    wrote in comp.lang.c:

    > Hello,
    >
    > I know you can cast a void pointer to an int, char, or any other type of
    > pointer, but can you do the reverse, cast an int or char pointer as a void
    > pounter?


    If you are using C, no cast is necessary for pointers. You can assign
    a pointer to void to a pointer to any other object type. You can
    assign a pointer to any object type to a pointer to void. No cast at
    all.

    If your compiler requires a cast, you are using a C++ compiler.

    On the other hand, casting a pointer type to a char or an int may
    result in undefined behavior.

    > This is the blowfish encipher algorithim and I need to make xl and xr void
    > because they come from a char * buffer, but I need them as unsigned longs.
    >
    > void encipher_dword(void *xl, void *xr)
    > {
    > unsigned long *temp;
    > unsigned long *al, *ar;
    > int i;
    >
    > al = (unsigned long *) xl;
    > ar = (unsigned long *) xr;


    This assignment does not require a cast, unless you are using C++, in
    which case you are posting in the wrong newsgroup.

    But without seeing the code that calls this, there is no way of
    telling if xl and xr are properly aligned to point to unsigned longs.
    If not, the result is undefined behavior when you try to dereference
    them. On some platforms the system will shut down your program with
    some sort of bus error.

    > for (i = 0; i < N; i++) {
    > *al = *al ^ P;
    > *ar = f(al) ^ *ar;
    > SWAP(al, ar, temp);
    > }
    > SWAP(al, ar, temp);
    >
    > *ar = *ar ^ P[N];
    > *al = *al ^ P[N + 1];
    > xl = (void *) al; //can I do this?
    > xr = ar; //should I do it like this?
    > }
    >
    > I thought of another solution being to swap the actual values in al and ar,
    > insted of just the addresses, but I thought that would be slower
    > implementation.
    >
    > Thanks,


    If you are concerned with speed, don't settle for what you thought.
    Write a program and test it.

    --
    Jack Klein
    Home: http://JK-Technology.Com
    FAQs for
    comp.lang.c http://www.eskimo.com/~scs/C-faq/top.html
    comp.lang.c++ http://www.parashift.com/c -faq-lite/
    alt.comp.lang.learn.c-c++ ftp://snurse-l.org/pub/acllc-c /faq
    Jack Klein, Jul 1, 2003
    #2
    1. Advertising

  3. On Tue, 01 Jul 2003 00:13:20 GMT,
    Jack Klein <> wrote:
    > On Mon, 30 Jun 2003 15:25:14 GMT, James Leddy <>
    > wrote in comp.lang.c:
    >
    >> Hello,
    >>
    >> I know you can cast a void pointer to an int, char, or any other type of
    >> pointer, but can you do the reverse, cast an int or char pointer as a void
    >> pounter?

    >
    > If you are using C, no cast is necessary for pointers. You can assign
    > a pointer to void to a pointer to any other object type. You can
    > assign a pointer to any object type to a pointer to void. No cast at
    > all.


    Not that this was relevant to the code the OP posted, but just for
    completeness; there is (at least) one case where a cast to void * is
    necessary (or at least generally more expedient than a temporary
    variable of type void *):

    char *p;
    /* more code assigning something to p */
    printf("Pointer p: %p\n", (void *) p);

    Martien
    --
    |
    Martien Verbruggen | Think of the average person. Half of the
    | people out there are dumber.
    |
    Martien Verbruggen, Jul 5, 2003
    #3
  4. James Leddy

    Mike Wahler Guest

    Martien Verbruggen <> wrote in message
    news:...
    > On Tue, 01 Jul 2003 00:13:20 GMT,
    > Jack Klein <> wrote:
    > > On Mon, 30 Jun 2003 15:25:14 GMT, James Leddy <>
    > > wrote in comp.lang.c:
    > >
    > >> Hello,
    > >>
    > >> I know you can cast a void pointer to an int, char, or any other type

    of
    > >> pointer, but can you do the reverse, cast an int or char pointer as a

    void
    > >> pounter?

    > >
    > > If you are using C, no cast is necessary for pointers. You can assign
    > > a pointer to void to a pointer to any other object type. You can
    > > assign a pointer to any object type to a pointer to void. No cast at
    > > all.

    >
    > Not that this was relevant to the code the OP posted, but just for
    > completeness; there is (at least) one case where a cast to void * is
    > necessary (or at least generally more expedient than a temporary
    > variable of type void *):
    >
    > char *p;
    > /* more code assigning something to p */
    > printf("Pointer p: %p\n", (void *) p);


    Non-sequitur.

    Your post does not address what Jack said:

    "You can assign a pointer to void to a pointer to any
    other object type. You can assign a pointer to any
    object type to a pointer to void. No cast at all."

    Your cast is not being used with an assignment.

    -Mike
    Mike Wahler, Jul 5, 2003
    #4
    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. Ollej Reemt
    Replies:
    7
    Views:
    501
    Jack Klein
    Apr 22, 2005
  2. Stig Brautaset

    `void **' revisited: void *pop(void **root)

    Stig Brautaset, Oct 25, 2003, in forum: C Programming
    Replies:
    15
    Views:
    778
    The Real OS/2 Guy
    Oct 28, 2003
  3. David M. Wilson
    Replies:
    8
    Views:
    481
    Ben Pfaff
    Jan 7, 2004
  4. Replies:
    5
    Views:
    815
    S.Tobias
    Jul 22, 2005
  5. Replies:
    1
    Views:
    395
    Victor Bazarov
    May 23, 2007
Loading...

Share This Page