By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
454,500 Members | 1,769 Online
Bytes IT Community
+ Ask a Question
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 <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.
Nov 18 '08 #1
Share this Question
Share on Google+
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 <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];
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 <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
Nov 18 '08 #2

P: n/a
arnuld <su*****@invalid.addresswrites:
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]$
Nov 18 '08 #3

P: n/a
On 18 Nov, 08:06, arnuld <sunr...@invalid.addresswrote:
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[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 <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[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.