454,500 Members | 1,769 Online Need help? Post your question and get tips & solutions from a community of 454,500 IT Pros & Developers. It's quick & easy.

# Passing an array of struct to function

 P: n/a 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 #include 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 = s1; arr = 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. Nov 18 '08 #1
4 Replies

 P: n/a arnuld said: 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 #include 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]; If you're going to put two elements into this array, why do you define it to have room for only one element? The answer to your second question is "yes". -- Richard Heathfield Email: -http://www. +rjh@ Google users: "Usenet is a strange place" - dmr 29 July 1999 Nov 18 '08 #2

 P: n/a arnuld #include 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 = s1; arr = s2; Remember C arrays are indexed from zero. So you want to assign to arr and arr. You could also do this more concisely with something like struct two_elem arr = { { '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.word and arr.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)'. 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]\$ Nov 18 '08 #3

 P: n/a On 18 Nov, 08:06, arnuld #include 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 = s1; oops. You accessed the second element of a single element array. * arr = 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 #include #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[i].ch, p[i].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  = s1; arr  = 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!" Nov 18 '08 #4

 P: n/a or #include #include #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[i].ch, p[i].word); } int main (void) { Two_elem arr [] = {{'a', "ARNULD"}, {'b', "UTTRE"}}; print_twoelem (arr, ARRAY_SIZE (arr)); return 0; } Nov 18 '08 #5

### This discussion thread is closed

Replies have been disabled for this discussion. 