# Passing an array of struct to function

A

#### arnuld

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 = 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 ==============================
[[email protected] C]\$ gcc4 -ansi -pedantic -Wall -Wextra array-of-struct.c
[[email protected] C]\$ ./a.out
first element = n, || <-
second element = a, || ARNULD
Segmentation fault
[[email protected] C]\$

N

#### Nate Eldredge

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];

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 ==============================
[[email protected] C]\$ gcc4 -ansi -pedantic -Wall -Wextra array-of-struct.c
[[email protected] C]\$ ./a.out
first element = n, || <-
second element = a, || ARNULD
Segmentation fault
[[email protected] C]\$

N

#### Nick Keighley

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 = 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 ==============================
[[email protected] C]\$ gcc4 -ansi -pedantic -Wall -Wextra array-of-struct.c
[[email protected] 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  = s1;
arr  = s2;

print_twoelem (arr, ARRAY_SIZE (arr));

return 0;
}

N

#### Nick Keighley

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;
}