SlideShare a Scribd company logo
Structures and Unions in C
Alan L. Cox
alc@rice.edu
Objectives
Be able to use compound data structures in
programs
Be able to pass compound data structures as
function arguments, either by value or by
reference
Be able to do simple bit-vector manipulations
Cox Structures and Unions 2
Cox Structures and Unions 3
Structures
Compound data:
A date is
 an int month and
 an int day and
 an int year
Unlike Java, C doesn’t
automatically define functions
for initializing and printing …
struct ADate {
int month;
int day;
int year;
};
struct ADate date;
date.month = 2;
date.day = 4;
date.year = 2021;
Cox Structures and Unions 4
Structure Representation & Size
sizeof(struct …) =
sum of sizeof(field)
+ alignment padding
Processor- and compiler-specific
62
61 EF BE AD DE
c1 c2 i
padding
struct CharCharInt {
char c1;
char c2;
int i;
} foo;
foo.c1 = ’a’;
foo.c2 = ’b’;
foo.i = 0xDEADBEEF;
x86 uses “little-endian” representation
Cox Structures and Unions 5
Typedef
Mechanism for creating new type names
 New names are an alias for some other type
 May improve the portability and/or clarity of the
program
typedef long int64_t;
typedef struct ADate {
int month;
int day;
int year;
} Date;
int64_t i = 100000000000;
Date d = { 2, 4, 2021 };
Overload existing type
names for portability
Simplify complex type names
Cox Structures and Unions 6
Constants
Allow consistent use of the same constant
throughout the program
 Improves clarity of the program
 Reduces likelihood of simple errors
 Easier to update constants in the program
int array[10];
for (i=0; i<10; i++) {
…
}
#define SIZE 10
int array[SIZE];
for (i=0; i<SIZE; i++) {
…
}
Preprocessor directive
Constant names are
capitalized by convention
Define once,
use throughout
the program
Cox Structures and Unions 7
Arrays of Structures
Date birthdays[NFRIENDS];
bool
check_birthday(Date today)
{
int i;
for (i = 0; i < NFRIENDS; i++) {
if ((today.month == birthdays[i].month) &&
(today.day == birthdays[i].day))
return (true);
return (false);
}
Constant
Array declaration
Array index, then
structure field
Cox Structures and Unions 8
Pointers to Structures
Date
create_date1(int month,
int day,
int year)
{
Date d;
d.month = month;
d.day = day;
d.year = year;
return (d);
}
void
create_date2(Date *d,
int month,
int day,
int year)
{
d->month = month;
d->day = day;
d->year = year;
}
Copies date
Pass-by-reference
Date today;
today = create_date1(2, 4, 2021);
create_date2(&today, 2, 4, 2021);
Cox Structures and Unions 9
Pointers to Structures (cont.)
void
create_date2(Date *d,
int month,
int day,
int year)
{
d->month = month;
d->day = day;
d->year = year;
}
void
fun_with_dates(void)
{
Date today;
create_date2(&today, 2, 4, 2021);
}
today.month:
today.day:
today.year:
0x1000
0x1004
0x1008
month: 2
day: 4
year: 2021
0x30A0
0x30A4
0x30A8
d: 0x1000
0x3098
2
4
2021
Cox Structures and Unions 10
Pointers to Structures (cont.)
Date *
create_date3(int month,
int day,
int year)
{
Date *d;
d->month = month;
d->day = day;
d->year = year;
return (d);
}
What is d pointing to?!?!
(more on this later)
Cox Structures and Unions 11
Abstraction in C
struct widget;
struct widget *widget_create(void);
int widget_op(struct widget *widget, int operand);
void widget_destroy(struct widget *widget);
From the #include file widget.h:
From the file widget.c:
#include “widget.h”
struct widget {
int x;
…
};
Definition is hidden!
Cox Structures and Unions 11
Cox Structures and Unions 12
Collections of Bools (Bit Vectors)
Byte, word, ... can represent many Booleans
One per bit, e.g., 00100101 = false, false, true, ..., true
Bit-wise operations:
Bit-wise AND: 00100101 & 10111100 == 00100100
Bit-wise OR: 00100101 | 10111100 == 10111101
Bit-wise NOT: ~ 00100101 == 11011010
Bit-wise XOR: 00100101 ^ 10111100 == 10011001
Cox Structures and Unions 13
Operations on Bit Vectors
const unsigned int low_three_bits_mask = 0x7;
unsigned int bit_vec = 0x15;
0…00 0111
0…01 0101
Always use C’s unsigned types for bit vectors
A mask indicates which bit positions we are interested in
0…00 0101 == 0…01 0101 & 0…00 0111
important_bits = bit_vec & low_three_bits_mask;
Selecting bits:
Result = ?
Cox Structures and Unions 14
Operations on Bit Vectors
const unsigned int low_three_bits_mask = 0x7;
unsigned int bit_vec = 0x15;
0…00 0111
0…01 0101
bit_vec |= low_three_bits_mask;
Setting bits:
Result = ?
0…01 0111 == 0…01 0101 | 0…00 0111
Cox Structures and Unions 15
Operations on Bit Vectors
const unsigned int low_three_bits_mask = 0x7;
unsigned int bit_vec = 0x15;
0…00 0111
0…01 0101
bit_vec &= ~low_three_bits_mask;
Clearing bits:
Result = ?
0…01 0000 == 0…01 0101 & ~0…00 0111
Cox Structures and Unions 16
Bit-field Structures
Special syntax packs
structure values more
tightly
Similar to bit vectors, but
arguably easier to read
 Nonetheless, bit vectors
are more commonly
used.
Padded to be an integral
number of words
 Placement is compiler-
specific.
1 1 0 1 1 0 … …
f1 f2 f3
struct Flags {
int f1:3;
unsigned int f2:1;
unsigned int f3:2;
} my_flags;
my_flags.f1 = -2;
my_flags.f2 = 1;
my_flags.f3 = 2;
Cox Structures and Unions 17
Unions
Choices:
An element is
 an int i or
 a char c
sizeof(union …) =
maximum of sizeof(field)
EF BE AD DE
c
i
padding
union AnElt {
int i;
char c;
} elt1, elt2;
elt1.i = 4;
elt2.c = ’a’;
elt2.i = 0xDEADBEEF;
Cox Structures and Unions 18
Unions
A union value doesn’t “know” which case it
contains
union AnElt {
int i;
char c;
} elt1, elt2;
elt1.i = 4;
elt2.c = ’a’;
elt2.i = 0xDEADBEEF;
if (elt1 currently has a char) …
How should your program keep track
whether elt1, elt2 hold an int or
a char?
?
?
Basic answer: Another variable holds
that info
Cox Structures and Unions 19
Tagged Unions
Tag every value with its case
I.e., pair the type info together with the union
Implicit in Java, Scheme, ML, …
Enum must be external to struct,
so constants are globally visible.
Struct field must be named.
enum Union_Tag { IS_INT, IS_CHAR };
struct TaggedUnion {
enum Union_Tag tag;
union {
int i;
char c;
} data;
};
Cox Structures and Unions 20
Next Time
Memory Allocation

More Related Content

PPT
Structure and Union.ppt
PPTX
introduction-of-struct-union in deatil.pptx
PPT
04-struct-union for ug students for colg
PPT
04 struct-union
PPTX
cprogramming Structures.pptx
PPTX
cprogramming Structures.pptx
PDF
(1) cpp abstractions user_defined_types
PDF
DATA STRUCTURE ARRAY AND STRUCTURES CHAPTER 2
Structure and Union.ppt
introduction-of-struct-union in deatil.pptx
04-struct-union for ug students for colg
04 struct-union
cprogramming Structures.pptx
cprogramming Structures.pptx
(1) cpp abstractions user_defined_types
DATA STRUCTURE ARRAY AND STRUCTURES CHAPTER 2

Similar to 04-struct-union.ppt (20)

PDF
DATA STRUCTRES ARRAY AND STRUCTURES CHAPTER 2
PPTX
C Programming: Structure and Union
ODP
(1) cpp abstractions user_defined_types
PDF
lec14.pdf
PPTX
COM1407: Structures, Unions & Dynamic Memory Allocation
PPTX
M-2-Pointers-2.pptx by engineering institutions
PPTX
programming in C and Datastructures deepdive
PDF
programming in C & Data structures an easy approach
PPT
C Structures & Unions
PDF
PDF
Data Structure and its Fundamentals
PPTX
Structure & union
PPT
structures and unions in 'C'
PPT
Lecture 19 - Struct and Union
PPTX
Chapter 8 Structure Part 2 (1).pptx
PPS
C programming session 13
PPTX
Structures
DOC
Structures unions
DOCX
C programming structures &amp; union
PDF
Unit 4 qba
DATA STRUCTRES ARRAY AND STRUCTURES CHAPTER 2
C Programming: Structure and Union
(1) cpp abstractions user_defined_types
lec14.pdf
COM1407: Structures, Unions & Dynamic Memory Allocation
M-2-Pointers-2.pptx by engineering institutions
programming in C and Datastructures deepdive
programming in C & Data structures an easy approach
C Structures & Unions
Data Structure and its Fundamentals
Structure & union
structures and unions in 'C'
Lecture 19 - Struct and Union
Chapter 8 Structure Part 2 (1).pptx
C programming session 13
Structures
Structures unions
C programming structures &amp; union
Unit 4 qba
Ad

More from Md Polash (6)

PPTX
Lecture 1.pptx
PDF
Progressive collapse
PDF
bilow.pdf
PPT
HSU1EngineeringProfessionAB.ppt
PPT
civil_engineering.ppt
PPT
structure analysis.ppt
Lecture 1.pptx
Progressive collapse
bilow.pdf
HSU1EngineeringProfessionAB.ppt
civil_engineering.ppt
structure analysis.ppt
Ad

Recently uploaded (20)

PPTX
BODY FLUIDS AND CIRCULATION class 11 .pptx
PDF
Sciences of Europe No 170 (2025)
PPTX
TOTAL hIP ARTHROPLASTY Presentation.pptx
PDF
CHAPTER 3 Cell Structures and Their Functions Lecture Outline.pdf
PPTX
C1 cut-Methane and it's Derivatives.pptx
PDF
Worlds Next Door: A Candidate Giant Planet Imaged in the Habitable Zone of ↵ ...
PDF
. Radiology Case Scenariosssssssssssssss
PPTX
perinatal infections 2-171220190027.pptx
PPTX
Pharmacology of Autonomic nervous system
PDF
ELS_Q1_Module-11_Formation-of-Rock-Layers_v2.pdf
PDF
Unveiling a 36 billion solar mass black hole at the centre of the Cosmic Hors...
PPTX
Introcution to Microbes Burton's Biology for the Health
PPTX
The Minerals for Earth and Life Science SHS.pptx
PPTX
Introduction to Cardiovascular system_structure and functions-1
PPTX
Microbes in human welfare class 12 .pptx
PDF
BET Eukaryotic signal Transduction BET Eukaryotic signal Transduction.pdf
PPTX
Biomechanics of the Hip - Basic Science.pptx
PDF
Biophysics 2.pdffffffffffffffffffffffffff
PPT
Heredity-grade-9 Heredity-grade-9. Heredity-grade-9.
PDF
The scientific heritage No 166 (166) (2025)
BODY FLUIDS AND CIRCULATION class 11 .pptx
Sciences of Europe No 170 (2025)
TOTAL hIP ARTHROPLASTY Presentation.pptx
CHAPTER 3 Cell Structures and Their Functions Lecture Outline.pdf
C1 cut-Methane and it's Derivatives.pptx
Worlds Next Door: A Candidate Giant Planet Imaged in the Habitable Zone of ↵ ...
. Radiology Case Scenariosssssssssssssss
perinatal infections 2-171220190027.pptx
Pharmacology of Autonomic nervous system
ELS_Q1_Module-11_Formation-of-Rock-Layers_v2.pdf
Unveiling a 36 billion solar mass black hole at the centre of the Cosmic Hors...
Introcution to Microbes Burton's Biology for the Health
The Minerals for Earth and Life Science SHS.pptx
Introduction to Cardiovascular system_structure and functions-1
Microbes in human welfare class 12 .pptx
BET Eukaryotic signal Transduction BET Eukaryotic signal Transduction.pdf
Biomechanics of the Hip - Basic Science.pptx
Biophysics 2.pdffffffffffffffffffffffffff
Heredity-grade-9 Heredity-grade-9. Heredity-grade-9.
The scientific heritage No 166 (166) (2025)

04-struct-union.ppt

  • 1. Structures and Unions in C Alan L. Cox alc@rice.edu
  • 2. Objectives Be able to use compound data structures in programs Be able to pass compound data structures as function arguments, either by value or by reference Be able to do simple bit-vector manipulations Cox Structures and Unions 2
  • 3. Cox Structures and Unions 3 Structures Compound data: A date is  an int month and  an int day and  an int year Unlike Java, C doesn’t automatically define functions for initializing and printing … struct ADate { int month; int day; int year; }; struct ADate date; date.month = 2; date.day = 4; date.year = 2021;
  • 4. Cox Structures and Unions 4 Structure Representation & Size sizeof(struct …) = sum of sizeof(field) + alignment padding Processor- and compiler-specific 62 61 EF BE AD DE c1 c2 i padding struct CharCharInt { char c1; char c2; int i; } foo; foo.c1 = ’a’; foo.c2 = ’b’; foo.i = 0xDEADBEEF; x86 uses “little-endian” representation
  • 5. Cox Structures and Unions 5 Typedef Mechanism for creating new type names  New names are an alias for some other type  May improve the portability and/or clarity of the program typedef long int64_t; typedef struct ADate { int month; int day; int year; } Date; int64_t i = 100000000000; Date d = { 2, 4, 2021 }; Overload existing type names for portability Simplify complex type names
  • 6. Cox Structures and Unions 6 Constants Allow consistent use of the same constant throughout the program  Improves clarity of the program  Reduces likelihood of simple errors  Easier to update constants in the program int array[10]; for (i=0; i<10; i++) { … } #define SIZE 10 int array[SIZE]; for (i=0; i<SIZE; i++) { … } Preprocessor directive Constant names are capitalized by convention Define once, use throughout the program
  • 7. Cox Structures and Unions 7 Arrays of Structures Date birthdays[NFRIENDS]; bool check_birthday(Date today) { int i; for (i = 0; i < NFRIENDS; i++) { if ((today.month == birthdays[i].month) && (today.day == birthdays[i].day)) return (true); return (false); } Constant Array declaration Array index, then structure field
  • 8. Cox Structures and Unions 8 Pointers to Structures Date create_date1(int month, int day, int year) { Date d; d.month = month; d.day = day; d.year = year; return (d); } void create_date2(Date *d, int month, int day, int year) { d->month = month; d->day = day; d->year = year; } Copies date Pass-by-reference Date today; today = create_date1(2, 4, 2021); create_date2(&today, 2, 4, 2021);
  • 9. Cox Structures and Unions 9 Pointers to Structures (cont.) void create_date2(Date *d, int month, int day, int year) { d->month = month; d->day = day; d->year = year; } void fun_with_dates(void) { Date today; create_date2(&today, 2, 4, 2021); } today.month: today.day: today.year: 0x1000 0x1004 0x1008 month: 2 day: 4 year: 2021 0x30A0 0x30A4 0x30A8 d: 0x1000 0x3098 2 4 2021
  • 10. Cox Structures and Unions 10 Pointers to Structures (cont.) Date * create_date3(int month, int day, int year) { Date *d; d->month = month; d->day = day; d->year = year; return (d); } What is d pointing to?!?! (more on this later)
  • 11. Cox Structures and Unions 11 Abstraction in C struct widget; struct widget *widget_create(void); int widget_op(struct widget *widget, int operand); void widget_destroy(struct widget *widget); From the #include file widget.h: From the file widget.c: #include “widget.h” struct widget { int x; … }; Definition is hidden! Cox Structures and Unions 11
  • 12. Cox Structures and Unions 12 Collections of Bools (Bit Vectors) Byte, word, ... can represent many Booleans One per bit, e.g., 00100101 = false, false, true, ..., true Bit-wise operations: Bit-wise AND: 00100101 & 10111100 == 00100100 Bit-wise OR: 00100101 | 10111100 == 10111101 Bit-wise NOT: ~ 00100101 == 11011010 Bit-wise XOR: 00100101 ^ 10111100 == 10011001
  • 13. Cox Structures and Unions 13 Operations on Bit Vectors const unsigned int low_three_bits_mask = 0x7; unsigned int bit_vec = 0x15; 0…00 0111 0…01 0101 Always use C’s unsigned types for bit vectors A mask indicates which bit positions we are interested in 0…00 0101 == 0…01 0101 & 0…00 0111 important_bits = bit_vec & low_three_bits_mask; Selecting bits: Result = ?
  • 14. Cox Structures and Unions 14 Operations on Bit Vectors const unsigned int low_three_bits_mask = 0x7; unsigned int bit_vec = 0x15; 0…00 0111 0…01 0101 bit_vec |= low_three_bits_mask; Setting bits: Result = ? 0…01 0111 == 0…01 0101 | 0…00 0111
  • 15. Cox Structures and Unions 15 Operations on Bit Vectors const unsigned int low_three_bits_mask = 0x7; unsigned int bit_vec = 0x15; 0…00 0111 0…01 0101 bit_vec &= ~low_three_bits_mask; Clearing bits: Result = ? 0…01 0000 == 0…01 0101 & ~0…00 0111
  • 16. Cox Structures and Unions 16 Bit-field Structures Special syntax packs structure values more tightly Similar to bit vectors, but arguably easier to read  Nonetheless, bit vectors are more commonly used. Padded to be an integral number of words  Placement is compiler- specific. 1 1 0 1 1 0 … … f1 f2 f3 struct Flags { int f1:3; unsigned int f2:1; unsigned int f3:2; } my_flags; my_flags.f1 = -2; my_flags.f2 = 1; my_flags.f3 = 2;
  • 17. Cox Structures and Unions 17 Unions Choices: An element is  an int i or  a char c sizeof(union …) = maximum of sizeof(field) EF BE AD DE c i padding union AnElt { int i; char c; } elt1, elt2; elt1.i = 4; elt2.c = ’a’; elt2.i = 0xDEADBEEF;
  • 18. Cox Structures and Unions 18 Unions A union value doesn’t “know” which case it contains union AnElt { int i; char c; } elt1, elt2; elt1.i = 4; elt2.c = ’a’; elt2.i = 0xDEADBEEF; if (elt1 currently has a char) … How should your program keep track whether elt1, elt2 hold an int or a char? ? ? Basic answer: Another variable holds that info
  • 19. Cox Structures and Unions 19 Tagged Unions Tag every value with its case I.e., pair the type info together with the union Implicit in Java, Scheme, ML, … Enum must be external to struct, so constants are globally visible. Struct field must be named. enum Union_Tag { IS_INT, IS_CHAR }; struct TaggedUnion { enum Union_Tag tag; union { int i; char c; } data; };
  • 20. Cox Structures and Unions 20 Next Time Memory Allocation