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[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. 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[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]\$ 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[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 #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 [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!" 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.