Passing an array of struct to function

Discussion in 'C Programming' started by arnuld, Nov 18, 2008.

  1. arnuld

    arnuld Guest

    I am passing an array of struct to a function to print its value. First
    I am getting Segfaults and weired values. 2nd, is there any elegant way to
    do this ?



    /* Learning how to use an array of struct */


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

    enum { ARR_SIZE = 1 };

    struct two_elem { char ch; char* word; };


    void print_twoelem( struct two_elem*);


    int main(void)
    {

    struct two_elem arr[ARR_SIZE];

    char arr1[] = "ARNULD";
    char arr2[] = "UTTRE";

    struct two_elem s1;
    struct two_elem s2;

    s1.ch = 'a';
    s1.word = arr1;
    s2.ch = 'b';
    s2.word = arr2;

    arr[1] = s1;
    arr[2] = s2;

    /* this is fine as we are passing a point to the first element which is struct
    two_ele and this is what exactly rquired by the function
    */
    print_twoelem( arr );


    return 0;
    }



    void print_twoelem( struct two_elem* p )
    {
    printf("first element = %c, || %s\n", p->ch, p->word);
    ++p;
    printf("second element = %c, || %s\n", p->ch, p->word);
    }

    ===================== OUTPUT ==============================
    [arnuld@dune C]$ gcc4 -ansi -pedantic -Wall -Wextra array-of-struct.c
    [arnuld@dune C]$ ./a.out
    first element = n, || <-
    second element = a, || ARNULD
    Segmentation fault
    [arnuld@dune C]$



    --
    www.lispmachine.wordpress.com
    my email is @ the above blog.
    arnuld, Nov 18, 2008
    #1
    1. Advertising

  2. arnuld <> writes:

    > I am passing an array of struct to a function to print its value. First
    > I am getting Segfaults and weired values. 2nd, is there any elegant way to
    > do this ?
    >
    >
    >
    > /* Learning how to use an array of struct */
    >
    >
    > #include <stdio.h>
    > #include <stdlib.h>
    >
    > enum { ARR_SIZE = 1 };
    >
    > struct two_elem { char ch; char* word; };
    >
    >
    > void print_twoelem( struct two_elem*);
    >
    >
    > int main(void)
    > {
    >
    > struct two_elem arr[ARR_SIZE];


    ARR_SIZE is 1. I think you want it to be 2.

    >
    > char arr1[] = "ARNULD";
    > char arr2[] = "UTTRE";
    >
    > struct two_elem s1;
    > struct two_elem s2;
    >
    > s1.ch = 'a';
    > s1.word = arr1;
    > s2.ch = 'b';
    > s2.word = arr2;
    >
    > arr[1] = s1;
    > arr[2] = s2;


    Remember C arrays are indexed from zero. So you want to assign to
    arr[0] and arr[1].

    You could also do this more concisely with something like

    struct two_elem arr[2] = { { 'a', "ARNULD" }, { 'b', "UTTRE" } };

    The only difference being that in my version you cannot overwrite the
    strings "ARNULD" and "UTTRE" (though you could set the pointers
    arr[0].word and arr[1].word to point to some different strings). But
    your program doesn't do that anyway.

    > /* this is fine as we are passing a point to the first element which is struct
    > two_ele and this is what exactly rquired by the function
    > */


    You might find it more helpful to think that the array decays to a
    pointer to its *zeroth* element. I.e. passing `arr' to the function is
    the same as passing `&(arr[0])'.

    > print_twoelem( arr );
    >
    >
    > return 0;
    > }
    >
    >
    >
    > void print_twoelem( struct two_elem* p )
    > {
    > printf("first element = %c, || %s\n", p->ch, p->word);
    > ++p;
    > printf("second element = %c, || %s\n", p->ch, p->word);
    > }
    >
    > ===================== OUTPUT ==============================
    > [arnuld@dune C]$ gcc4 -ansi -pedantic -Wall -Wextra array-of-struct.c
    > [arnuld@dune C]$ ./a.out
    > first element = n, || <-
    > second element = a, || ARNULD
    > Segmentation fault
    > [arnuld@dune C]$
    Nate Eldredge, Nov 18, 2008
    #2
    1. Advertising

  3. On 18 Nov, 08:06, arnuld <> wrote:

    > I am passing an array of struct to a function to print its value. First
    > I am getting Segfaults and weired values. 2nd, is there any elegant way to
    > do this ?
    >
    > /* Learning how to use an array of struct */
    >
    > #include <stdio.h>
    > #include <stdlib.h>
    >
    > enum { ARR_SIZE = 1 };


    that's an unusual size for an array



    > struct two_elem { char ch; char* word; };
    >
    > void print_twoelem( struct two_elem*);
    >
    > int main(void)
    > {
    >
    >   struct two_elem arr[ARR_SIZE];
    >
    >   char arr1[] = "ARNULD";
    >   char arr2[] = "UTTRE";
    >
    >   struct two_elem s1;
    >   struct two_elem s2;
    >
    >   s1.ch = 'a';
    >   s1.word = arr1;
    >   s2.ch = 'b';
    >   s2.word = arr2;
    >
    >   arr[1] = s1;


    oops. You accessed the second element of a single element array.

    >   arr[2] = s2;


    oops. You accessed the third element of a single element array.
    C arrays start from zero

    >   /* this is fine as we are passing a point to the first element which is struct
    >      two_ele and this is what exactly rquired by the function
    >   */


    yes

    >   print_twoelem( arr );
    >
    >   return 0;
    >
    > }
    >
    > void print_twoelem( struct two_elem* p )
    > {
    >   printf("first element  = %c, || %s\n", p->ch, p->word);


    you access the uninitialised 1st element

    >   ++p;
    >   printf("second element = %c, || %s\n", p->ch, p->word);


    you access the non-existent 2nd element


    >
    > }
    >
    > ===================== OUTPUT ==============================
    > [arnuld@dune C]$ gcc4 -ansi -pedantic -Wall -Wextra array-of-struct.c
    > [arnuld@dune C]$ ./a.out
    > first element  = n, || <-
    > second element = a, || ARNULD
    > Segmentation fault


    quite

    this is how I'd write it (some things are just different personnel
    style)

    ***************************************************************

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

    #define ARR_SIZE 2

    #define ARRAY_SIZE(A) sizeof(A)/sizeof(*A)

    typedef struct
    {
    char ch;
    char* word;
    } Two_elem;

    void print_twoelem (const Two_elem p[], int n)
    {
    int i;

    for (i = 0; i < n; i++)
    printf ("first element = %c, || %s\n", p.ch, p.word);
    }

    int main (void)
    {
    Two_elem arr [ARR_SIZE];
    char arr1[] = "ARNULD";
    char arr2[] = "UTTRE";
    Two_elem s1;
    Two_elem s2;

    s1.ch = 'a';
    s1.word = arr1;
    s2.ch = 'b';
    s2.word = arr2;

    arr [0] = s1;
    arr [1] = s2;

    print_twoelem (arr, ARRAY_SIZE (arr));

    return 0;
    }

    --
    Nick Keighley

    "That's right!" shouted Vroomfondel "we demand rigidly defined
    areas of doubt and uncertainty!"
    Nick Keighley, Nov 18, 2008
    #3
  4. or

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

    #define ARRAY_SIZE(A) sizeof(A)/sizeof(*A)

    typedef struct
    {
    char ch;
    char* word;
    } Two_elem;

    void print_twoelem (const Two_elem p[], int n)
    {
    int i;

    for (i = 0; i < n; i++)
    printf ("first element = %c, || %s\n", p.ch, p.word);
    }

    int main (void)
    {
    Two_elem arr [] = {{'a', "ARNULD"}, {'b', "UTTRE"}};

    print_twoelem (arr, ARRAY_SIZE (arr));

    return 0;
    }
    Nick Keighley, Nov 18, 2008
    #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. Chris Fogelklou
    Replies:
    36
    Views:
    1,371
    Chris Fogelklou
    Apr 20, 2004
  2. Ole
    Replies:
    4
    Views:
    595
    Michael Wojcik
    Oct 26, 2004
  3. beetle
    Replies:
    2
    Views:
    902
    beetle
    Jan 25, 2005
  4. Daniel Rudy
    Replies:
    7
    Views:
    447
    Daniel Rudy
    Mar 31, 2006
  5. Tuan  Bui
    Replies:
    14
    Views:
    470
    it_says_BALLS_on_your forehead
    Jul 29, 2005
Loading...

Share This Page