# 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[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 ==============================
[[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[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 ==============================
[[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[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 ==============================
[[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 [0] = s1;
arr [1] = 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;
}