This is CS50
● What are pointers, and how can we become familiar
with their syntax?
● How can we read and write data from a file?
● What is dynamic memory, and how should we use it?
Pointers
Variables
int calls = 4; calls
4
Variables
int calls = 4; calls
name 4
Variables
int calls = 4; calls
type 4
Variables
int calls = 4; calls
value 4
Variables
int calls = 4; calls
4
0x1A
Pointers
int *p = 0x1A; p
0x1A
Pointers
int *p = 0x1A; p
name 0x1A
Pointers
int *p = 0x1A; p
type 0x1A
Pointers
int *p = 0x1A; p
value 0x1A
Pointers
int *p = 0x1A; p
0x1A
0xF0
Pointer Syntax
calls; calls
"value of" 4
0x1A
Pointer Syntax
p; p
"value of" 0x1A
0xF0
Pointer Syntax
&calls; calls
"address of" 4
0x1A
Pointer Syntax
&p; p
"address of" 0x1A
0xF0
Pointer Syntax
*p; p calls
"go to the value at 0x1A 4
address stored in p"
0x1A
Pointer Syntax
*p; p calls
"go to the value at 0x1A 4
address stored in p"
0x1A
type * is a pointer that stores the address of a type.
*x takes a pointer x and goes to the address stored at
that pointer.
&x takes x and gets its address.
Pointer Prediction Exercise
Visualize the code on the left, step by step. How do the values
of the variables evolve? It's okay to use made-up addresses.
What will the final values for each variable or pointer be?
Download, compile, and run pointers.c in VS Code to find out.
int a = 28;
int b = 50; a b c
int *c = &a;
Address Address Address
*c = 14; Value Value Value
c = &b;
*c = 25;
File I/O
hi.txt
hi!
0x456
FILE *input = fopen("hi.txt", "r");
hi.txt
hi!
0x456
FILE *input = fopen("hi.txt", "r");
name hi.txt
input hi!
0x456
FILE *input = fopen("hi.txt", "r");
type
hi.txt
input hi!
0x456
FILE *input = fopen("hi.txt", "r");
value
hi.txt
input hi!
0x456
0x456
hi.txt
input hi!
0x456
0x456
hi.txt
input
hi.txt
input
hi.txt
input
buffer
fread(buffer, 1, 3, input);
fread(buffer, 1, 3, input);
Location to read from
fread(buffer, 1, 3, input);
Size of blocks to read (in bytes)
fread(buffer, 1, 3, input);
How many blocks to read
fread(buffer, 1, 3, input);
Location to store blocks
fread(buffer, 1, 3, input);
Location to read from
hi.txt
input
fread(buffer, 1, 3, input);
Size of blocks to read (in bytes)
hi.txt
fread(buffer, 1, 3, input);
How many blocks to read
hi.txt
fread(buffer, 1, 3, input);
Location to store blocks
file_pointer
buffer
file_pointer
buffer
file_pointer
buffer[0]
file_pointer
buffer[1]
file_pointer
buffer[2]
fread(buffer, 1, 4, input);
fwrite(buffer, 1, 4, output);
output_file
buffer
output_file
buffer
File Reading Exercise
Create a program, pdf.c, that checks whether a file, passed in
as a command-line argument, is a PDF. All PDFs will begin with
a four byte sequence, corresponding to these integers:
37 80 68 70
Dynamic
Memory
int *hours = malloc(sizeof(int));
hours
?
int *hours = malloc(sizeof(int) * 5);
hours
? ? ? ? ?
*hours = 7;
hours
7 ? ? ? ?
*hours = 7;
*(hours + 1) = 9;
hours
7 9 ? ? ?
hours[2] = 8;
hours
7 9 8 ? ?
hours[2] = 8;
hours[3] = 7;
hours
7 9 8 7 ?
Heap
Stack
Common memory errors
Failing to free every block of memory which we've malloc'd.
Failing to fclose every file we've fopened.
Using more memory than we've allocated.
Debugging Memory Exercise
Debug a program, create.c, that creates the file given as input
at the command-line. For example,
./create test.c
will create a file, test.c. But our code has three memory errors!
Can you find and fix them? Try running the below to check:
valgrind ./create test.c
This was CS50