0% found this document useful (0 votes)
16 views15 pages

C Structures and Unions Explained

This document discusses C structures and unions. It explains that structures allow grouping of multiple data types together but are treated as scalar types. Structures can contain other structures recursively through pointers. Unions share the same memory region for multiple data types specified as members. The document provides examples of declaring and using structures and unions, and discusses memory layout, bit fields, passing structures as function arguments, and initialization of unions.

Uploaded by

midhungbabu88
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
16 views15 pages

C Structures and Unions Explained

This document discusses C structures and unions. It explains that structures allow grouping of multiple data types together but are treated as scalar types. Structures can contain other structures recursively through pointers. Unions share the same memory region for multiple data types specified as members. The document provides examples of declaring and using structures and unions, and discusses memory layout, bit fields, passing structures as function arguments, and initialization of unions.

Uploaded by

midhungbabu88
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd

C structures and unions

(Reek, Ch. 10)

1 CS 3090: Safety Critical Programming in C


C structures: aggregate, yet scalar
 aggregate in that they hold multiple data items at one time
 named members hold data items of various types
 like the notion of class/field in C or C++
– but without the data hiding features
 scalar in that C treats each structure as a unit
 as opposed to the “array” approach: a pointer to a collection of
members in memory
 entire structures (not just pointers to structures) may be passed
as function arguments, assigned to variables, etc.
 Interestingly, they cannot be compared using ==
(rationale: too inefficient)

2 CS 3090: Safety Critical Programming in C


Structure declarations
 Combined variable and type declaration
struct tag {member-list} variable-list;
 Any one of the three portions can be omitted

struct {int a, b; char *p;} x, y; /* omit tag */


 variables x, y declared with members as described:
int members a, b and char pointer p.
 x and y have same type, but differ from all others –
even if there is another declaration:
struct {int a, b; char *p;} z;
/* z has different type from x, y */

3 CS 3090: Safety Critical Programming in C


Structure declarations
struct S {int a, b; char *p;}; /* omit variables */
 No variables are declared, but there is now a type struct
S that can be referred to later

struct S z; /* omit members */


 Given an earlier declaration of struct S, this declares a
variable of that type

typedef struct {int a, b; char *p;} S;


/* omit both tag and variables */
 This creates a simple type name S
(more convenient than struct S)

4 CS 3090: Safety Critical Programming in C


Recursively defined structures
 Obviously, you can’t have a structure that contains an
instance of itself as a member – such a data item would be
infinitely large
 But within a structure you can refer to structures of the
same type, via pointers
struct TREENODE {
char *label;
struct TREENODE *leftchild, *rightchild;
}

5 CS 3090: Safety Critical Programming in C


Recursively defined structures
 When two structures refer to each other, one must be
declared in incomplete (prototype) fashion
struct HUMAN;
struct PET {
char name[NAME_LIMIT];
char species[NAME_LIMIT];
struct HUMAN *owner;
} fido = {″Fido″, ″Canis lupus familiaris ″};
struct HUMAN {
char name[NAME_LIMIT];
We can’t initialize the owner member
struct PET pets[PET_LIMIT]; at this point,
} sam = {″Sam″, {fido}}; since it hasn’t been declared yet

6 CS 3090: Safety Critical Programming in C


Member access
 Direct access operator s.m
 subscript and dot operators have same precedence and associate
left-to-right, so we don’t need parentheses for
[Link][0].species
 Indirect access s->m: equivalent to (*s).m
 Dereference a pointer to a structure, then return a member of
that structure
 Dot operator has higher precedence than indirection operator ,
so parentheses are needed in (*s).m
(*[Link]).name or [Link]->name

. evaluated first: access owner member . and -> have equal precedence and
* evaluated next: dereference pointer to HUMAN associate left-to-right
7 CS 3090: Safety Critical Programming in C
Memory layout
struct COST { int amount;
char currency_type[2]; }
struct PART { char id[2];
struct COST cost;
int num_avail; }
layout of struct PART:
currency_type

id amount num_avail

cost
Here, the system uses 4-byte alignment of integers,
so amount and num_avail must be aligned
Four bytes wasted for each structure!

8 CS 3090: Safety Critical Programming in C


Memory layout
A better alternative (from a space perspective):
struct COST { int amount;
char currency_type; }
struct PART { struct COST cost;
char id[2];
int num_avail;
}
currency_type

amount id num_avail
cost

9 CS 3090: Safety Critical Programming in C


Bit fields Bit field members must be ints

 If space is a serious concern, you can select the number of


bits used for each member
struct CHAR { unsigned ch: 7;
Note: This won’t work on
unsigned font: 6; machines with 16-bit ints
unsigned size: 19; };
Layout possibilities (machine-dependent):

ch font size

size font ch

10 CS 3090: Safety Critical Programming in C


Bit fields
 Portability is an issue:
 Do any bit field sizes exceed the machine’s int size?
 Is there any pointer manipulation in your code that assumes a
particular layout?
 Bit fields are “syntactic sugar” for more complex
shifting/masking
 e.g. to get font value, mask off the ch and size bits, then shift
right by 19
 This is what actually happens in the object code –
bit fields just make it look simpler at the source level

11 CS 3090: Safety Critical Programming in C


Structures as function arguments
 Structures are scalars, so they can be returned and passed
as arguments – just like ints, chars
struct BIG changestruct(struct BIG s);
 Call by value: temporary copy of structure is created
 Caution: passing large structures is inefficient
– involves a lot of copying
 avoid by passing a pointer to the structure instead:
void changestruct(struct BIG *s);
 What if the struct argument is read-only?
 Safe approach: use const
void changestruct(struct BIG const *s);

12 CS 3090: Safety Critical Programming in C


Unions
 Like structures, but every member occupies the same
region of memory!
 Structures: members are “and”ed together: “name and species
and owner”
 Unions: members are “xor”ed together

union VALUE {
float f;
int i;
char *s;
};
/* either a float xor an int xor a string */

13 CS 3090: Safety Critical Programming in C


Unions
 Up to programmer to determine how to interpret a union
(i.e. which member to access)
 Often used in conjunction with a “type” variable that
indicates how to interpret the union value

enum TYPE { INT, FLOAT, STRING };


struct VARIABLE {
enum TYPE type; Access type to determine
union VALUE value; how to interpret value
};

14 CS 3090: Safety Critical Programming in C


Unions
 Storage
 size of union is the size of its largest member
 avoid unions with widely varying member sizes;
for the larger data types, consider using pointers instead
 Initialization
 Union may only be initialized to a value appropriate for the
type of its first member

15 CS 3090: Safety Critical Programming in C

You might also like