Lecture 4
Lecture 4
0 1 2 3 4 5 6 7
8 9 10 11 12 13 14 15
16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31
0 1 2 3 4 5 6 7
8 9 10 11 12 13 14 15
16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31
0 1 2 3 4 5 6 7
8 9 A B C D E F
10 11 12 13 14 15 16 17
18 19 1A 1B 1C 1D 1E 1F
0123456789ABCDEF
0 1 2 3 4 5 6 7 8 9 A B C D E F
0 1 2 3 4 5 6 7 8 9 A B C D E F
0 1 2 3 4 5 6 7 8 9 A B C D E F
base-16
hexadecimal
27 26 25 24 23 22 21 20
11111111
128 64 32 16 8 4 2 1
11111111
128 64 32 16 8 4 2 1
11111111
128 × 1 + 64 × 1 + 32 × 1 + 16 × 1 + 8 × 1 + 4 × 1 + 2 × 1 + 1 × 1
128 64 32 16 8 4 2 1
11111111
255
102 101 100
255
100 10 1
255
161 160
##
16 1
##
16 1
00
16 1
01
16 1
02
16 1
03
16 1
04
16 1
05
16 1
06
16 1
07
16 1
08
16 1
09
16 1
0A
16 1
0B
16 1
0C
16 1
0D
16 1
0E
16 1
0F
16 1
10
16 1
16 1
FF
16 1
FF
16 × F + 1×F
16 1
FF
16 × 15 + 1 × 15
16 1
FF
240 + 15
16 1
FF
255
128 64 32 16 8 4 2 1
11111111
255
11111111
1111 1111
F F
RGB
72 73 33
48 49 21
0x48 0x49 0x21
0 1 2 3 4 5 6 7
8 9 A B C D E F
10 11 12 13 14 15 16 17
18 19 1A 1B 1C 1D 1E 1F
0 1 2 3 4 5 6 7
8 9 A B C D E F
10 11 12 13 14 15 16 17
18 19 1A 1B 1C 1D 1E 1F
0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7
*
pointers
int n = 50;
int *p = &n;
50
n
50
0x123
0x123
p
50
0x123
0x123
p
50
0x123
p
50
0x123
string
string s = "HI!";
H I ! \0
H I ! \0
s[0] s[1] s[2] s[3]
H I ! \0
0x123 0x124 0x125 0x126
0x123
s
H I ! \0
0x123 0x124 0x125 0x126
s
H I ! \0
0x123 0x124 0x125 0x126 0x127
s
E M M \0
0x123 0x124 0x125 0x126 0x127
s
E M A 00000000
0x123 0x124 0x125 0x126 0x127
string s = "HI!";
char *s = "HI!";
char *s = "HI!";
typedef struct
{
string name;
string number;
}
person;
typedef struct
{
string name;
string number;
}
person;
typedef char *string;
pointer arithmetic
string
char *
s
s
H I ! \0
s
H I ! \0
0x123 0x124 0x125 0x126
0x123
s
H I ! \0
0x123 0x124 0x125 0x126
0x123
s t
H I ! \0
0x123 0x124 0x125 0x126
0x123
s t
H I ! \0 H I ! \0
0x123 0x124 0x125 0x126
0x123
s t
H I ! \0 H I ! \0
0x123 0x124 0x125 0x126 0x456 0x457 0x498 0x459
0x123 0x456
s t
H I ! \0 H I ! \0
0x123 0x124 0x125 0x126 0x456 0x457 0x498 0x459
s t
H I ! \0 H I ! \0
0x123 0x124 0x125 0x126 0x456 0x457 0x498 0x459
char *
s
s
h i ! \0
s
h i ! \0
0x123 0x124 0x125 0x126
0x123
s
h i ! \0
0x123 0x124 0x125 0x126
0x123
s t
h i ! \0
0x123 0x124 0x125 0x126
0x123 0x123
s t
h i ! \0
0x123 0x124 0x125 0x126
s t
h i ! \0
0x123 0x124 0x125 0x126
s t
H i ! \0
0x123 0x124 0x125 0x126
malloc
free
…
s
h i ! \0
0x123 0x124 0x125 0x126
s t
h i ! \0
0x123 0x124 0x125 0x126
s t
h i ! \0
0x123 0x124 0x125 0x126 0x456 0x457 0x458 0x459
s t
h i ! \0
0x123 0x124 0x125 0x126 0x456 0x457 0x458 0x459
s t
h i ! \0 h
0x123 0x124 0x125 0x126 0x456 0x457 0x458 0x459
s t
h i ! \0 h i
0x123 0x124 0x125 0x126 0x456 0x457 0x458 0x459
s t
h i ! \0 h i !
0x123 0x124 0x125 0x126 0x456 0x457 0x458 0x459
s t
h i ! \0 h i ! \0
0x123 0x124 0x125 0x126 0x456 0x457 0x458 0x459
s t
h i ! \0 H i ! \0
0x123 0x124 0x125 0x126 0x456 0x457 0x458 0x459
valgrind
int main(void)
{
int *x;
int *y;
x = malloc(sizeof(int));
*x = 42;
*y = 13;
y = x;
*y = 13;
}
int main(void)
{
int *x;
int *y;
x = malloc(sizeof(int));
*x = 42;
*y = 13;
y = x;
*y = 13;
}
int main(void)
{
int *x;
int *y;
x = malloc(sizeof(int));
*x = 42;
*y = 13;
y = x;
*y = 13;
}
int main(void)
{
int *x;
int *y;
x = malloc(sizeof(int));
*x = 42;
*y = 13;
y = x;
*y = 13;
}
int main(void)
{
int *x;
int *y;
x = malloc(sizeof(int));
*x = 42;
*y = 13;
y = x;
*y = 13;
}
int main(void)
{
int *x;
int *y;
x = malloc(sizeof(int));
*x = 42;
*y = 13;
y = x;
*y = 13;
}
int main(void)
{
int *x;
int *y;
x = malloc(sizeof(int));
*x = 42;
*y = 13;
y = x;
*y = 13;
}
garbage values
void swap(int a, int b)
{
}
void swap(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
void swap(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
↑
stack
machine code
↑
stack
machine code
globals
heap
↓
↑
stack
machine code
globals
heap
↓
↑
stack
machine code
globals
heap
↓
↑
stack
machine code
globals
heap
↓
↑
stack
machine code
globals
heap
↓
↑
stack
↑
stack
void swap(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
main
swap
main
main
x y
1 2
x y
swap
1 2
x y
a b tmp
1 2
x y
1 2
a b tmp
1 2
x y
int tmp = a;
a = b;
b = tmp;
1 2
a b tmp
1 2
x y
int tmp = a;
a = b;
b = tmp;
1 2 1
a b tmp
1 2
x y
int tmp = a;
a = b;
b = tmp;
2 2 1
a b tmp
1 2
x y
int tmp = a;
a = b;
b = tmp;
2 1 1
a b tmp
1 2
x y
2 1 1
a b tmp
1 2
x y
1 2
x y
void swap(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
1 2
x y
a b tmp
1 2
x y
int tmp = *a;
*a = *b;
*b = tmp;
a b tmp
1 2
x y
int tmp = *a;
*a = *b;
*b = tmp;
1
a b tmp
1 2
x y
int tmp = *a;
*a = *b;
*b = tmp;
1
a b tmp
2 2
x y
int tmp = *a;
*a = *b;
*b = tmp;
1
a b tmp
2 1
x y
1
a b tmp
2 1
x y
2 1
x y
void swap(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
machine code
globals
heap
↓
↑
stack
heap
↓
↑
stack
heap overflow
stack overflow
buffer overflow
get_char
get_double
get_float
get_int
get_long
get_string
...
scanf
...
file I/O
JPEG
BMP
This is CS50