void pointers and scanf/printf

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • pereges

    void pointers and scanf/printf

    have i written this program correctly ?

    it is giving me correct output but i am little suspicious in the
    following two statements -

    scanf("%d", &ptr->data) and printf("%d\n", ptr->data).

    /********** LINK LIST **********/

    #include <stdio.h>
    #include <stdlib.h>

    typedef struct node_s
    {
    void *data;
    struct node_s *next;

    }node;


    int add_to_link_lis t(node **head)
    {
    node *ptr;
    int temp;

    ptr = malloc(sizeof(n ode));

    if (ptr == NULL)
    {
    fprintf(stderr, "Memory allocation failed\n");
    return (1);
    }

    ptr->data = malloc(sizeof(i nt));
    if (ptr->data == NULL)
    {
    fprintf(stderr, "Memory allocation failed\n");
    return (1);
    }

    printf("Enter data\n");
    if (scanf("%d", &ptr->data) != 1)
    {
    fprintf(stderr, "Error while entering data\n");
    return (1);
    }

    ptr->next = *head;
    *head = ptr;

    return (0);
    }

    int main(void)
    {
    node *head = NULL;
    node *ptr;
    int n, i;

    printf("How many numbers\n");
    if (scanf("%d", &n) != 1)
    {
    fprintf(stderr, "Error while enterning list size\n");
    return (EXIT_FAILURE);
    }

    for (i = 0; i < n; i++)
    {
    if (add_to_link_li st(&head))
    {
    fprintf(stderr, "add_to_link_li st failed\n");
    return (EXIT_FAILURE);
    }
    }

    ptr = head;

    while (ptr != NULL)
    {
    printf("%d\n", ptr->data);
    ptr = ptr->next;
    }

    return (EXIT_SUCCESS);
    }
  • voidpointer

    #2
    Re: void pointers and scanf/printf

    On Jul 20, 5:53 pm, pereges <Brol...@gmail. comwrote:
    have i written this program correctly ?
    >
    it is giving me correct output but i am little suspicious in the
    following two statements -
    >
    scanf("%d", &ptr->data) and printf("%d\n", ptr->data).
    >
    /********** LINK LIST **********/
    >
    #include <stdio.h>
    #include <stdlib.h>
    >
    typedef struct node_s
    {
    void *data;
    struct node_s *next;
    >
    }node;
    >
    int add_to_link_lis t(node **head)
    {
    node *ptr;
    int temp;
    >
    ptr = malloc(sizeof(n ode));
    >
    if (ptr == NULL)
    {
    fprintf(stderr, "Memory allocation failed\n");
    return (1);
    }
    >
    ptr->data = malloc(sizeof(i nt));
    if (ptr->data == NULL)
    {
    fprintf(stderr, "Memory allocation failed\n");
    return (1);
    }
    >
    printf("Enter data\n");
    if (scanf("%d", &ptr->data) != 1)
    {
    fprintf(stderr, "Error while entering data\n");
    return (1);
    }
    >
    ptr->next = *head;
    *head = ptr;
    >
    return (0);
    >
    }
    >
    int main(void)
    {
    node *head = NULL;
    node *ptr;
    int n, i;
    >
    printf("How many numbers\n");
    if (scanf("%d", &n) != 1)
    {
    fprintf(stderr, "Error while enterning list size\n");
    return (EXIT_FAILURE);
    }
    >
    for (i = 0; i < n; i++)
    {
    if (add_to_link_li st(&head))
    {
    fprintf(stderr, "add_to_link_li st failed\n");
    return (EXIT_FAILURE);
    }
    }
    >
    ptr = head;
    >
    while (ptr != NULL)
    {
    printf("%d\n", ptr->data);
    ptr = ptr->next;
    }
    >
    return (EXIT_SUCCESS);
    >
    }
    your program don't work, have a segfault, compile with -Wall (if
    you're using gcc) and try solve the errors, any doubt post here

    Comment

    • pereges

      #3
      Re: void pointers and scanf/printf

      On Jul 21, 2:23 am, voidpointer <diegorocha1... @gmail.comwrote :
      your program don't work, have a segfault, compile with -Wall (if
      you're using gcc) and try solve the errors, any doubt post here
      Hello, Can you please check the first post again ? I have changed the
      code. I got no warnings from my dmc/pellesC compilers and the outpu is
      correct.

      Comment

      • voidpointer

        #4
        Re: void pointers and scanf/printf

        On Jul 20, 6:28 pm, pereges <Brol...@gmail. comwrote:
        On Jul 21, 2:23 am, voidpointer <diegorocha1... @gmail.comwrote :
        >
        your program don't work, have a segfault, compile with -Wall (if
        you're using gcc) and try solve the errors, any doubt post here
        >
        Hello, Can you please check the first post again ? I have changed the
        code. I got no warnings from my dmc/pellesC compilers and the outpu is
        correct.
        Hello, now work but have one warning message,

        In function 'add_to_link_li st':
        test.c:30: warning: format '%d' expects type 'int *', but argument 2
        has type 'void *'

        you can solve this with a cast in your scanf, like this scanf("%d",
        (int*)ptr->data)
        and you have a lot of memory leak in your code, you doesn't free()d
        the allocated space by malloc,
        other thing, if you expect work with int, so use int, because void*
        can be hard to work,
        and need a lot of cast in your code

        Comment

        • voidpointer

          #5
          Re: void pointers and scanf/printf

          On Jul 20, 6:57 pm, voidpointer <diegorocha1... @gmail.comwrote :
          On Jul 20, 6:28 pm, pereges <Brol...@gmail. comwrote:
          >
          On Jul 21, 2:23 am, voidpointer <diegorocha1... @gmail.comwrote :
          >
          your program don't work, have a segfault, compile with -Wall (if
          you're using gcc) and try solve the errors, any doubt post here
          >
          Hello, Can you please check the first post again ? I have changed the
          code. I got no warnings from my dmc/pellesC compilers and the outpu is
          correct.
          >
          Hello, now work but have one warning message,
          >
          In function 'add_to_link_li st':
          test.c:30: warning: format '%d' expects type 'int *', but argument 2
          has type 'void *'
          >
          you can solve this with a cast in your scanf, like this scanf("%d",
          (int*)ptr->data)
          and you have a lot of memory leak in your code, you doesn't free()d
          the allocated space by malloc,
          other thing, if you expect work with int, so use int, because void*
          can be hard to work,
          and need a lot of cast in your code
          only a correction, use scanf("%d", (int*)&ptr->data), sorry

          Comment

          • pereges

            #6
            Re: void pointers and scanf/printf

            On Jul 21, 3:12 am, voidpointer <diegorocha1... @gmail.comwrote :
            only a correction, use scanf("%d", (int*)&ptr->data), sorry
            but ptr->data is already address then why &ptr->data ?

            Comment

            • Ben Bacarisse

              #7
              Re: void pointers and scanf/printf

              voidpointer <diegorocha1987 @gmail.comwrite s:
              On Jul 20, 6:28 pm, pereges <Brol...@gmail. comwrote:
              >On Jul 21, 2:23 am, voidpointer <diegorocha1... @gmail.comwrote :
              >>
              your program don't work, have a segfault, compile with -Wall (if
              you're using gcc) and try solve the errors, any doubt post here
              >>
              >Hello, Can you please check the first post again ? I have changed the
              >code. I got no warnings from my dmc/pellesC compilers and the outpu is
              >correct.
              >
              Hello, now work but have one warning message,
              >
              In function 'add_to_link_li st':
              test.c:30: warning: format '%d' expects type 'int *', but argument 2
              has type 'void *'
              Check the code, your compiler or the message you really get. The
              argument is of type void **.
              you can solve this with a cast in your scanf, like this scanf("%d",
              (int*)ptr->data)
              This won't fix the problem.

              --
              Ben.

              Comment

              • Ben Bacarisse

                #8
                Re: void pointers and scanf/printf

                pereges <Broli00@gmail. comwrites:
                have i written this program correctly ?
                >
                it is giving me correct output but i am little suspicious in the
                following two statements -
                >
                scanf("%d", &ptr->data) and printf("%d\n", ptr->data).
                Context:
                typedef struct node_s
                {
                void *data;
                struct node_s *next;
                >
                }node;
                You are right to be. You can't use %d to scanf into a void * and the
                reverse is also wrong.

                If you want a linked list of ints, then 'data' should be an int. If
                you want something more generic, you could use union. More generalt
                still comes from keeping the data field as void *, but allocating
                storage for it to point to whatever you need to store.

                In the Bad Old Days, it was a common trick to smuggle small data types
                into a generic list by putting them into the void * (actually I've not
                seen it done since void * arrived, but the same applies). It is not a
                good idea.

                --
                Ben.

                Comment

                • neobakuer

                  #9
                  Re: void pointers and scanf/printf

                  On Jul 20, 7:15 pm, pereges <Brol...@gmail. comwrote:
                  On Jul 21, 3:12 am, voidpointer <diegorocha1... @gmail.comwrote :
                  >
                  only a correction, use scanf("%d", (int*)&ptr->data), sorry
                  >
                  but ptr->data is already address then why &ptr->data ?
                  this is only to avoid the warning message.

                  But as said voidpointer and Ben, if you want work with int, use int.

                  Comment

                  • Ben Bacarisse

                    #10
                    Re: void pointers and scanf/printf

                    pereges <Broli00@gmail. comwrites:
                    On Jul 21, 3:12 am, voidpointer <diegorocha1... @gmail.comwrote :
                    >
                    >only a correction, use scanf("%d", (int*)&ptr->data), sorry
                    >
                    but ptr->data is already address then why &ptr->data ?
                    You some problems if you are asking this. I thought you'd written

                    scanf("%d", &ptr->data)

                    because you were knowingly breaking the type rules to put an int into
                    value into a void * object.

                    Both

                    scanf("%d", ptr->data)

                    and the type-correct version:

                    scanf("%d", (int *)ptr->data)

                    are wrong because they try to use an indeterminate pointer. The data
                    field has not been set to point anywhere. If you want data to point
                    to an int and then to read into it you must write:

                    ptr->data = malloc(sizeof(i nt));
                    if (ptr->data && scanf("%d", (int *)ptr->data) == 1) ...

                    Both what you had

                    scanf("%d", &ptr->data)

                    and the slightly better

                    scanf("%d", (int *)&ptr->data)

                    are wrong because they try to put an into a void * object. It often
                    works (as you have found out) but it is much better to do this:

                    struct node {
                    union {
                    int i;
                    void *vp;
                    } data;
                    struct node *next;
                    };

                    if you want to put ints into the actual nodes themselves. You then

                    scanf("%d", &ptr->data.i)

                    in a type-safe manner.

                    --
                    Ben.

                    Comment

                    • Harald van =?UTF-8?b?RMSzaw==?=

                      #11
                      Re: void pointers and scanf/printf

                      On Sun, 20 Jul 2008 15:51:13 -0700, neobakuer wrote:
                      On Jul 20, 7:15 pm, pereges <Brol...@gmail. comwrote:
                      >On Jul 21, 3:12 am, voidpointer <diegorocha1... @gmail.comwrote :
                      only a correction, use scanf("%d", (int*)&ptr->data), sorry
                      >>
                      >but ptr->data is already address then why &ptr->data ?
                      >
                      this is only to avoid the warning message.
                      (int*)&ptr->data avoids the warning message and is incorrect in this case.
                      (int*)ptr->data avoids the warning message and is correct. This is not
                      directed at you specifically, but please try to understand warnings before
                      modifying code to work around them.

                      Comment

                      • Harald van =?UTF-8?b?RMSzaw==?=

                        #12
                        Re: void pointers and scanf/printf

                        On Sun, 20 Jul 2008 23:58:16 +0100, Ben Bacarisse wrote:
                        pereges <Broli00@gmail. comwrites:
                        >On Jul 21, 3:12 am, voidpointer <diegorocha1... @gmail.comwrote :
                        >>
                        >>only a correction, use scanf("%d", (int*)&ptr->data), sorry
                        >>
                        >but ptr->data is already address then why &ptr->data ?
                        >
                        You some problems if you are asking this. I thought you'd written
                        >
                        scanf("%d", &ptr->data)
                        >
                        because you were knowingly breaking the type rules to put an int into
                        value into a void * object.
                        >
                        Both
                        >
                        scanf("%d", ptr->data)
                        >
                        and the type-correct version:
                        >
                        scanf("%d", (int *)ptr->data)
                        >
                        are wrong because they try to use an indeterminate pointer. The data
                        field has not been set to point anywhere.
                        To quote the original message:

                        ptr->data = malloc(sizeof(i nt));
                        if (ptr->data == NULL)
                        {
                        fprintf(stderr, "Memory allocation failed\n");
                        return (1);
                        }

                        printf("Enter data\n");
                        if (scanf("%d", &ptr->data) != 1)
                        {
                        fprintf(stderr, "Error while entering data\n");
                        return (1);
                        }

                        ptr->data has been properly initialised, so

                        scanf("%d", (int *)ptr->data)

                        is correct.

                        Comment

                        • Ben Bacarisse

                          #13
                          Re: void pointers and scanf/printf

                          Harald van Dijk <truedfx@gmail. comwrites:
                          On Sun, 20 Jul 2008 23:58:16 +0100, Ben Bacarisse wrote:
                          >Both
                          >>
                          > scanf("%d", ptr->data)
                          >>
                          >and the type-correct version:
                          >>
                          > scanf("%d", (int *)ptr->data)
                          >>
                          >are wrong because they try to use an indeterminate pointer. The data
                          >field has not been set to point anywhere.
                          >
                          To quote the original message:
                          >
                          ptr->data = malloc(sizeof(i nt));
                          <snip>
                          ptr->data has been properly initialised, so
                          >
                          scanf("%d", (int *)ptr->data)
                          >
                          is correct.
                          Blimey! Must go to sleep. Totally missed that!

                          --
                          Ben.

                          Comment

                          • pereges

                            #14
                            Re: void pointers and scanf/printf

                            I had delete the previous code and posted a new code. I don't know how
                            others can still see the previous code but it happens always with
                            google and its quite irritating.

                            Anyway, thanks for the help Harald and Ben.

                            Comment

                            • Richard Heathfield

                              #15
                              Re: void pointers and scanf/printf

                              pereges said:
                              I had delete the previous code and posted a new code. I don't know how
                              others can still see the previous code but it happens always with
                              google and its quite irritating.
                              Google has nothing to do with it. Usenet is not Google, any more than the
                              World Wide Web is Internet Explorer, email is Outlook Express, or
                              spreadsheets are Lotus 1-2-3.

                              When you post a Usenet article, it is sent to a great many servers all over
                              the world. It used to be pretty easy to cancel messages until that service
                              got abused. Now, few servers honour cancellation requests - it's a shame,
                              but it's easy to understand why. Even if Google offers a cancellation
                              option, the rest of the world is under no obligation to follow suit.

                              --
                              Richard Heathfield <http://www.cpax.org.uk >
                              Email: -http://www. +rjh@
                              Google users: <http://www.cpax.org.uk/prg/writings/googly.php>
                              "Usenet is a strange place" - dmr 29 July 1999

                              Comment

                              Working...