dynamic memory, structs, unions -...
TRANSCRIPT
![Page 1: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/1.jpg)
Dynamic Memory, Structs, Unions
Alexander Nelson
September 7, 2018
University of Arkansas - Department of Computer Science and Computer Engineering
![Page 2: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/2.jpg)
Dynamic Memory
![Page 3: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/3.jpg)
Dynamic Memory
C allows allocation of dynamic memory during execution
Useful for:
• Allocation of arrays
• Allocation of memory to hold data in structures
1
![Page 4: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/4.jpg)
Dynamic Memory Functions
Part of C Standard Library
void *malloc(size t numBytes);
• Return null pointer to uninitialized allocated memory (or
NULL if unsatisfied)
void *calloc(int numElements, size t numBytes);
• Same as malloc() but memory initialized to zero
2
![Page 5: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/5.jpg)
Dynamic Memory Functions
void *realloc(void* p, size t numBytes);
• Change size of memory pointed to by pointer
• Contents will be unchanged
• Copies data to new location if necessary
• NULL if unsatisfied
void free(void *p);
• Deallocates memory pointed to by p
• p must point to previously allocated memory
3
![Page 6: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/6.jpg)
void* and size t
void* is C’s generic pointer
Any pointer type can be converted to void* and back again
without loss of information
size t is an unsigned integral type
Use instead of int to express “the size of something”
4
![Page 7: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/7.jpg)
Dynamic Memory & Arrays
malloc() – returns void pointer to uninitialized memory
int *p = (int*)malloc(42*sizeof(int));
for(k=0;k<42;k++)
p[k] = k;
for(k=0;k<42;k++)
printf("%d\n",p[k]);
5
![Page 8: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/8.jpg)
Dynamic Memory & Arrays
calloc() – returns void pointer to memory initialized to zero
int * p = (int*)calloc(42,sizeof(int));
for(k=0;k<42;k++);
printf("%d\n",p[k]);
Alternatively:
int * p = (int*)calloc(42,sizeof(int));
for(k=0;k<42;k++);
printf("%d\n",p++);
6
![Page 9: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/9.jpg)
realloc()
realloc() changes size of dynamic memory
int k=0, *p = (int *)malloc( 42 * sizeof(int));
for (k = 0; k < 42; k++)
p[k] = k; // Set all 42 ints = index
p = (int *)realloc( p, 99 * sizeof(int));
for (k = 42; k < 99; k++)
p[k] = k * 2; // Set 43-99 = 2*index
for(k=0; k < 99; k++)
printf("p[ %d ] = %d\n", k, p[k]);
//Original still intact
7
![Page 10: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/10.jpg)
Test Returned Pointer
malloc(), calloc(), realloc() return NULL if not satisfied
Validate the return value
i.e.
int* myArrPtr = malloc(10*sizeof(int));
if(myArrPtr==NULL) //DO SOMETHING
8
![Page 11: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/11.jpg)
assert()
In <assert.h>
assert(expression) (i.e. assert(1==1))
If boolean parameter true, execution continues
If boolean parameter false, output to stderr & terminate
Can be used for any condition:
• File open
• Enough memory available
• Function parameter checking
9
![Page 12: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/12.jpg)
free()
free() returns dynamically allocated memory to the heap
Freeing NULL pointer has no effect
Failure to free() memory is known as “memory leak”
int *myPtr = (int*)calloc(42,sizeof(int));
//Do stuff
free(myPtr);
10
![Page 13: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/13.jpg)
Structs & Unions
![Page 14: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/14.jpg)
Structs
C not object oriented
Struct – C method for combining related data
All data in a struct can be accessed by any code
11
![Page 15: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/15.jpg)
Struct
Represents a block of memory where a set of variables are stored
Each member of struct has offset from beginning of struct block
General form of struct definition:
struct example{
type exParam1;
type exParam2;
};
Note the semicolon at the end!
12
![Page 16: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/16.jpg)
Struct Example
A point in the 2D Euclidean plane
struct point{
int x;
int y;
};
struct point p1,p2;
p1.x = 5;
p2.y = 3;
13
![Page 17: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/17.jpg)
Structs & Functions
structs may be passed to & returned from functions
// struct point is a function parameter
void printPoint( struct point aPoint) {
printf ("( %2d, %2d )", aPoint.x, aPoint.y);
}
// struct point is the return type
struct point inputPoint( ) {
struct point p;
printf("please input the x- and y-coordinates: ");
scanf("%d %d", &p.x, &p.y); //Dangerous (unvalidated)
return p;
}
int main ( ) {
struct point endpoint; // endpoint is a struct point variable
endpoint = inputPoint( );
printPoint( endpoint );
return 0;
}14
![Page 18: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/18.jpg)
Initializing structs
struct variables may be initialized when declared
Provide initial values for each member in order of declaration
e.g. struct point p1 = {5,7};
May be declared at same time struct defined
e.g.
struct point{int x,y;} startpoint={5,7}, endpoint;
15
![Page 19: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/19.jpg)
typedef and structs
Common to use a typedef for name of struct to make code concise
e.g.
typedef struct point{
int x, y;
} POINT_t;
Defines structure “point” and allows declaration with “POINT t”
e.g. POINT t startpoint;
16
![Page 20: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/20.jpg)
typedef and enums
typedef and enums are similar
typedef enum months{...} MONTHS e;
MONTHS e myMonth = MAY;
17
![Page 21: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/21.jpg)
struct assignment
Contents of struct variable may be copied using assignment
typedef struct point{int x,y;} POINT_t;
POINT_t p1, p2;
p1.x = 10;
p1.y = -12;
p2 = p1; // same as p2.x = p1.x; p2.y = p1.y;
Assignment represents copying a block of memory
18
![Page 22: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/22.jpg)
struct within a struct
A data element in a struct may be another struct
Similar to class composition in OOP
Example:
typedef struct line{POINT_t start, end;} LINE_t;
How would you access the X coordinate of the start point?
19
![Page 23: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/23.jpg)
struct within a struct
A data element in a struct may be another struct
Similar to class composition in OOP
Example:
typedef struct line{POINT_t start, end;} LINE_t;
How would you access the X coordinate of the start point?
line.start.x = 13;
20
![Page 24: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/24.jpg)
Arrays of structs
Arrays of structs can be created
e.g. LINE t lines[5];
Pointers to structs can be created
e.g. LINE t * linePtr; linePtr = &lines[0];
21
![Page 25: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/25.jpg)
Arrays within a struct
A struct element may be an element
typedef struct month{
int nrDays;
char name[3+1];
}MONTH_t;
MONTH_t january = {31,"JAN"};
january.name[2] = ‘N’
22
![Page 26: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/26.jpg)
Bit Fields
To save space, struct elements may be bit-packed
Known as bit fields
struct weather{
unsigned int temperature : 5;
unsigned int windSpeed : 6;
unsigned int isRaining : 1;
unsinged int isSunny : 1;
unsigned int isSnowing : 1;
};
Above is 14 bits – uses 2 bytes
23
![Page 27: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/27.jpg)
Bit Fields
Almost everything about bit fields is implementation specific
Depends on machine & compiler
Bit fields may only be defined as (unsigned) ints Bit fields do not
have addresses (i.e. & operator does not work)
24
![Page 28: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/28.jpg)
Unions
Union – Variable type that may hold one variable from a set of
variable types
• All members share the SAME memory
• Compiler assigns enough memory for largest type
• Syntax is similar to struct
25
![Page 29: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/29.jpg)
Union Definition
General Form:
union ex{
type member1;
type member2;
};
Only member1 or member2 may be declared
26
![Page 30: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/30.jpg)
Example Union Application
struct square { int length; };
struct circle { int radius; };
struct rectangle { int width; int height; };
enum shapeType {SQUARE, CIRCLE, RECTANGLE };
union shapes {
struct square aSquare;
struct circle aCircle;
struct rectangle aRectangle;
};
struct shape {
enum shapeType type;
union shapes theShape;
};
27
![Page 31: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/31.jpg)
Example Union Application
double area( struct shape s) {
switch( s.type ) {
case SQUARE:
return s.theShape.aSquare.length *
s.theShape.aSquare.length;
case CIRCLE:
return 3.14 * s.theShape.aCircle.radius *
s.theShape.aCircle.radius;
case RECTANGLE :
return s.theShape.aRectangle.height *
s.theShape.aRectangle.width;
}
}
28
![Page 32: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/32.jpg)
Union vs. Struct
Similarities:
• Syntax nearly identical
• Member access nearly identical
Differences:
• Struct members have own memory
• Size of struct at least as big as sum of sizes of members
• Members of union share memory
• Size of union is size of largest member
29
![Page 33: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/33.jpg)
Struct Storage in Memory
Struct elements stored in order they are declared in
Total size reserved not necessarily sum of size of elements
• Some systems require variables aligned at certain memory
addresses
• Requires padding between member variables
• Reordering of members may reduce padded bytes
Rule of thumb: Place larger byte members at the beginning of
definition
30
![Page 34: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/34.jpg)
Padding Example
31
![Page 35: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/35.jpg)
Union Example
32
![Page 36: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/36.jpg)
Structs & Pointers
![Page 37: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/37.jpg)
Pointers to Structs
structs and pointers often go hand-in-hand
• structs in dynamic memory
• Passing a struct by reference to a function
• Self-referential structs
Syntax is exactly what you would expect
STRUCT t *myStructPtr = &myStruct;
STRUCT t *myStructPtr = (STRUCT t *)
malloc(sizeof(STRUCT t));
33
![Page 38: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/38.jpg)
Pointers in a struct
Data members of struct may be any type, including pointers
#define FNSIZE 50
#define LNSIZE 40
typedef struct name{
char first[ FNSIZE + 1 ];
char last [ LNSIZE + 1 ];
} NAME_t;
typedef struct person{
NAME_t *pName; // pointer to NAME struct
int age;
double gpa;
} PERSON_t;
How do you access a PERSON t element’s first name? 34
![Page 39: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/39.jpg)
Arrow Operator
Arrow Operator – “->”
Dereference operator is a prefix (e.g. *thisPtr)
So, (*thisPtr).member is a bit verbose
Arrow Operator equivalent to dereference and member access
thisPtr->member == (*thisPtr).member
35
![Page 40: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/40.jpg)
Self-Referential structs
Create powerful data structures when struct data member is a
pointer to same type
typedef struct player{
char name[20];
struct player *teammate; /* cant use TEAMMATE_t yet */
} TEAMMATE_t;
TEAMMATE_t *team, bob, harry, john;
team = &bob; /* first player */
strncpy(bob.name, ‘‘bob’’, 20);
bob.teammate = &harry; /* next teammate */
strncpy(harry.name, ‘‘harry’’, 20);
harry.teammate = &john; /* next teammate */
strncpy(john.name, ‘‘bill’’, 20);
john.teammate = NULL: /* last teammate */ 36
![Page 41: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/41.jpg)
Iterating through linked structs
Loop through structure until NULL encountered
// start with first player
TEAMMATE *t = team; // t is now equal to &bob
// while there are more players...
while (t != NULL) {
printf(‘‘%s\n’’, t->name); // (*t).name
// next player
t = t->teammate; //t=(*t).teammate;
}
37
![Page 42: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/42.jpg)
Dynamic Memory for structs
typedef struct player{
char name[20];
struct player *teammate;
} PLAYER;
PLAYER *getPlayer( ){
char *name = askUserForPlayerName( );
PLAYER *p = (PLAYER *)malloc(sizeof(PLAYER));
strncpy( p->name, name, 20 );
p->teammate = NULL;
return p;
}
38
![Page 43: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/43.jpg)
Dynamic Memory for structs
int main ( ){
int nrPlayers, count = 0;
PLAYER *pPlayer, *pTeam = NULL;
nrPlayers = askUserForNumberOfPlayers( );
while (count < nrPlayers){
pPlayer = getPlayer( );
pPlayer->teammate = pTeam;
pTeam = pPlayer;
++count;
}
/* do other stuff with the PLAYERs */
/* Exercise -- Make the structure doubly linked */
/* Exercise2 -- write code to free ALL the PLAYERs */
return 0;
}
39
![Page 44: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/44.jpg)
Variable Quantifiers
![Page 45: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/45.jpg)
Variable Quantifiers – auto
auto – default for function/block variables
auto int a == int a
Storage automatically allocated on function/block entry
Freed when function/block exited
May not be used with global variables
40
![Page 46: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/46.jpg)
Variable Quantifiers – register
register – Hint to compiler that a variable will be used frequently
Compiler free to ignore the hint
“&” operator does not work with these variables
Why?
If ignored, variable equivalent to an “auto” except the “&”
operator will not work
Rarely used – modern compilers do better optimization
41
![Page 47: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/47.jpg)
Variable Quantifiers – extern
Let compiler know of global variable in another file
extern keyword is for declaration not definition
extern keyword does not create storage
Storage must be created with global definition
42
![Page 48: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/48.jpg)
Variable Quantifiers – static
Static – extends lifetime of variable to program operation
May not be accessed outside of declaring file, even if global
43
![Page 49: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/49.jpg)
Variable Initialization
auto, register and static variables may be initialized at creation
Global & static variables are automatically initialized to 0 if not
provided
auto and register variables will contain uninitialized memory
Rule of thumb: Initialize variables at declaration
44
![Page 50: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/50.jpg)
Variable Quantifiers – volatile
volatile – indicates variable value may be affected outside
sequential execution
Two primary scenarios:
• Memory mapped devices & registers
• Global variables accessed by multiple tasks or interrupts
Prevents the compiler from making optimizations to relationships
of code
45
![Page 51: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/51.jpg)
volatile Example
int main(){
while (A0 != 0) {
//do nothing and wait
//volatile A0 forces the compiler
//not to remove this loop
}
B0 = 1;
return;
}
A0 likely defined as a volatile unit8 t
46
![Page 52: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/52.jpg)
volatile & Software Delays
Volatile is often used to create a software delay loop that won’t
disappear
void delay(void){
volatile int count;
for (count=255;count>0;count--);
return;
}
47
![Page 53: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/53.jpg)
Variable Quantifiers – const
const – used with datatype declaration to specify unchanging value
const objects may not be changed
e.g.
const int five = 5; five += 1; //illegal
48
![Page 54: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/54.jpg)
Interpreting const Qualifier
Read declarations from right to left:
Declaration Read As Usage Notes
const int x x is an integer constantcannot modify x
int const x x is a constant integer
const int *x x is pointer to integer
constant
can modify where x points,
but can’t dereference it to
modify the value it points
to
int const *x x is pointer to constant
integer
int * const x x is constant pointer to
integer
can’t modify where x
points, but can dereference
& modify value
const int * const x x is constant pointer to
integer constant
can’t modify where x
points & can’t dereference
and modify valueint const * const x x is a constant pointer
to a constant integer 49
![Page 55: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/55.jpg)
Common Memory Bugs
![Page 56: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/56.jpg)
Using * and ++
Avoid using * operator and ++ operator in same line
What do these do?:
• *ptr++
• (*ptr)++
• ++*ptr
• ++(*ptr)
50
![Page 57: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/57.jpg)
Using * and ++
Avoid using * operator and ++ operator in same line
What do these do?:
• *ptr++ – Dereference ptr, then increment ptr
• (*ptr)++ – Post-increment what ptr points to
• ++*ptr – Increment ptr, then dereference
• ++(*ptr) – Pre-increment what ptr points to
Not obvious what these lines do – make explicit!
51
![Page 58: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/58.jpg)
Dereferencing Bad Pointers
Passing incorrect pointer address
Common when accidentally passing value instead of pointer
Hopefully caught by compiler as error
e.g.
int val;
scanf(“%d”,val); (should be *val)
52
![Page 59: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/59.jpg)
Reading Uninitialized Memory
Assuming heap data initialized to zero is incorrect
/* return y = A times x */
int *matvec(int A[N][N], int x[N]) {
int *y = malloc( N * sizeof(int));
int i, j;
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
y[i] += A[i][j] * x[j]; // Uninitialized y
// could cause error
return y;
}
53
![Page 60: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/60.jpg)
Overwriting Memory
Allocating the wrong sized object
int i, **p;
p = malloc(N * sizeof(int));
for (i = 0; i < N; i++) {
p[ i ] = malloc(M * sizeof(int));
}
Should have used “sizeof(int*)”
If different sizes, the array will overwrite memory locations or have
incorrect values
54
![Page 61: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/61.jpg)
Overwriting Memory
Not checking max string size
char s[8];
int i;
gets(s); /* reads "123456789" from stdin */
Major culprit for buffer overflow attacks
55
![Page 62: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/62.jpg)
Overwriting Memory
Misunderstanding Pointer Arithmetic
int *search(int *p, int val) {
while (*p != NULL && *p != val)
p += sizeof(int);
return p;
}
p+=sizeof(int) will add sizeof(int)*sizeof(int) to the pointer
56
![Page 63: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/63.jpg)
Referencing Nonexistent Variables
Remember variable lifetime!
int * sum(int a, int b){
int c = a + b;
return &c;
}
Why would this function not work?
57
![Page 64: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/64.jpg)
Referencing Nonexistent Variables
Remember variable lifetime!
int * sum(int a, int b){
int c = a + b;
return &c;
}
Why would this function not work?
a, b, c all have lifetime of this function
Pointer address now references a freed location in the stack
58
![Page 65: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/65.jpg)
Freeing block multiple times
x = malloc(N * sizeof(int));
<manipulate x>
free(x);
y = malloc( M * sizeof(int));
<manipulate y>
free(x);
Undefined behavior! x may point at the same location as y!
Set freed pointers to NULL to avoid
59
![Page 66: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/66.jpg)
Referencing Freed Blocks
x = malloc(N * sizeof(int));
<manipulate x>
free(x);
...
y = malloc(M * sizeof(int));
for (i = 0; i < M; i++)
y[ i ] = x[ i ]++;
Similarly undefined! X may or may not be valid memory location
Set freed pointers to NULL to avoid
60
![Page 67: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/67.jpg)
Failing to Free Blocks
int foo(int x,int y, int z) {
int result;
int *p = malloc(n * sizeof(int));
...
//forget to free p
return result;
}
Memory Leak! Make sure to free all dynamically allocated memory!
61
![Page 68: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/68.jpg)
Freeing only part of Data Structure
typedef struct list {
char * nameString;
struct list *next;
} LIST_t;
foo() {
struct list *head = malloc(sizeof(LIST_t));
head->val = malloc((NAMESIZE+1)*sizeof(char));
head->next = NULL;
<create and manipulate the rest of the list>
free(head); //only use of free
return;
}
Two problems here:
What are they?
62
![Page 69: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/69.jpg)
Freeing only part of Data Structure
typedef struct list {
char * nameString;
struct list *next;
} LIST_t;
foo() {
struct list *head = malloc(sizeof(LIST_t));
head->val = malloc((NAMESIZE+1)*sizeof(char));
head->next = NULL;
<create and manipulate the rest of the list>
free(head); //only use of free
return;
}
Two problems here:
What are they?
nameString not freed; Other blocks in list not freed;63
![Page 70: Dynamic Memory, Structs, Unions - csce.uark.educsce.uark.edu/~ahnelson/CSCE4114/lectures/lecture5.pdf · Dynamic Memory, Structs, Unions Alexander Nelson September 7, 2018 University](https://reader030.vdocuments.site/reader030/viewer/2022041210/5dd080a0d6be591ccb614ca4/html5/thumbnails/70.jpg)
Dealing with Memory Bugs
Conventional Debuggers (e.g. gdb)
Binary translator: valgrind (Linux)
• Powerful debugging & analysis technique
• Rewrites text section of executable object files
• Can detect dynamic memory errors(e.g. bad pointers,
overwriting memory, referencing outside allocated block)
Garbage Collection – Let the system free blocks instead of
programmer
64