C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello...
Transcript of C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello...
![Page 2: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/2.jpg)
Computer ScienceScience
I have stopped reading Stephen King novels.
Now I just read C code instead.
- Richard O’Keefe
2
![Page 3: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/3.jpg)
Computer ScienceScience
Agenda1.Overview
2.Basic syntax & structure
3.Compilation
4.Visibility & Lifetime
3
![Page 4: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/4.jpg)
Computer ScienceScience
Agenda5.Pointers & Arrays
6.Dynamic memory allocation
7.Composite data types
8.Function pointers
4
![Page 5: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/5.jpg)
Computer ScienceScience
Not a Language Course!- Resources:
- K&R (The C Programming Language)
- comp.lang.C FAQ (c-faq.com)
- UNIX man pages (kernel.org/doc/man-pages/)
5
![Page 6: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/6.jpg)
Computer ScienceScience
>man strlenNAME strlen - find length of string
LIBRARY Standard C Library (libc, -lc)
SYNOPSIS #include <string.h>
size_t strlen(const char *s);
DESCRIPTION The strlen() function computes the length of the string s.
RETURN VALUES The strlen() function returns the number of characters that precede the terminating NUL character.
SEE ALSO string(3)
6
![Page 7: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/7.jpg)
Computer ScienceScience
§Overview
7
![Page 8: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/8.jpg)
Computer ScienceScience
C is …- imperative
- statically typed
- weakly type checked
- procedural
- low level
8
![Page 9: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/9.jpg)
Computer ScienceScience
C Java
Procedural Object-oriented
Source-level portability Compiled-code portability
Manual memory management Garbage collected
Pointers reference addresses Opaque memory references
Manual error code checking Exception handling
Manual namespace partitioning Namespaces with packages
Lower level libraries High level class libraries
9
![Page 10: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/10.jpg)
Computer ScienceScience
C: “Make it efficient and simple, and let the programmer do whatever she wants”
Java: “Make it portable, provide a huge class library, and try to protect the programmer from doing stupid things.”
Language Philosophies
10
![Page 11: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/11.jpg)
Computer ScienceScience
A language that doesn't have everything is actually easier to program in than some that do.
- Dennis Ritchie
11
![Page 12: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/12.jpg)
Computer ScienceScience
C standard is established by theAmerican National Standards Institute;
current spec: ANSI C11
12
![Page 13: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/13.jpg)
Computer ScienceScience
- Language syntax & semantics
- Runtime features & behavior
- Type info, memory model, etc.
- (Very limited) standard library API
What’s in C11?
13
![Page 14: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/14.jpg)
Computer ScienceScience
Why is this interesting?- Because of what C11 leaves out!
- e.g., we’re used to vast standard libraries & platform independence
- … not with C!
- a lot of decisions left to the compiler
14
![Page 15: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/15.jpg)
Computer ScienceScience
§Basic syntax & structure
15
![Page 16: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/16.jpg)
Computer ScienceScience
Primitive Types- char: one byte integer (e.g., for ASCII)
- int: integer, at least 16 bits
- float: single precision floating point
- double:double precision floating point
16
![Page 17: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/17.jpg)
Computer ScienceScience
Integer type prefixes- signed (default), unsigned
- same storage size, but sign bit on/off- short, long
- sizeof (short int) ≥ 16 bits- sizeof (long int) ≥ 32 bits- sizeof (long long int) ≥ 64 bits
17
![Page 18: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/18.jpg)
Computer ScienceScience
/* types are implicitly converted */char c = 0x41424344;int i = 1.5;unsigned int u = -1;float f = 10;double d = 2.5F; // note 'F' suffix for float literals
printf("c = '%c', i = %d, u = %u, f = %f, d = %f\n", c, i, u, f, d);
/* typecasts can be used to force conversions */int r1 = f / d, r2 = f / (int) d;
printf("r1 = %d, r2 = %d\n", r1, r2);
Recall C’s weak type-checking…
c = 'D', i = 1, u = 4294967295, f = 10.000000, d = 2.500000r1 = 4, r2 = 5
18
![Page 19: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/19.jpg)
Computer ScienceScience
Basic Operators- Arithmetic: +, -, *, /, %, ++, --, &, |, ~
- Relational: <, >, <=, >=, ==, !=
- Logical: &&, ||, !
- Assignment: =, +=, *=, …
- Conditional: bool ? true_exp : false_exp
19
![Page 20: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/20.jpg)
Computer ScienceScience
True/False- 0 = False
- Everything else = True
20
![Page 21: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/21.jpg)
Computer ScienceScience
!(0)
0 || 2
3 && 0 && 6
!(1234)
!!(-1020)
Boolean Expressions→ 1
→ 1
→ 0
→ 0
→ 1
21
![Page 22: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/22.jpg)
Computer ScienceScience
Control Structures-if-else
-switch-case
-while, for, do-while
-continue, break
- “Infinitely abusable” goto
22
![Page 23: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/23.jpg)
Computer ScienceScience
- Must declare before use
- Declaration implicitly allocates storage for underlying data
- Note: not true in Java!
- Scope: global, local, static
Variables
23
![Page 24: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/24.jpg)
Computer ScienceScience
Functions- C’s top-level modules
- Procedural language vs. OO: no classes!
24
![Page 25: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/25.jpg)
Computer ScienceScience
public class Demo { public static void main (String[] args) { System.out.printf("Hello world!"); }}
int main (int argc, char *argv[]) { printf("Hello world!"); return 0;}
vs.
25
![Page 26: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/26.jpg)
Computer ScienceScience
Declaration vs. Definition- (Distinction doesn’t exist in Java)
- Declaration (aka prototype): arg & ret type
- Definition: function body
- At compile-time, function call only requires declaration
26
![Page 27: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/27.jpg)
Computer ScienceScience
Important: many declarations are ok, but only a single definition!
27
![Page 28: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/28.jpg)
Computer ScienceScience
Declarations reside in header (.h) files,Definitions reside in source (.c) files
(Suggestions, not really requirements)
28
![Page 29: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/29.jpg)
Computer ScienceScience
void mem_init(void);void mem_deinit(void);void *mem_sbrk(int incr);void mem_reset_brk(void);void *mem_heap_lo(void);void *mem_heap_hi(void);size_t mem_heapsize(void);size_t mem_pagesize(void);
void mem_init(void){ /* allocate the storage we will use to model the available VM */ if ((mem_start_brk = (char *)malloc(MAX_HEAP)) == NULL) { fprintf(stderr, "mem_init_vm: malloc error\n"); exit(1); } mem_max_addr = mem_start_brk + MAX_HEAP; /* max legal heap address */ mem_brk = mem_start_brk; /* heap is empty initially */}
/* * mem_deinit - free the storage used by the memory system model */void mem_deinit(void){ free(mem_start_brk);}
/* * mem_reset_brk - reset the simulated brk pointer to make an empty heap */void mem_reset_brk(){ mem_brk = mem_start_brk;}...
memlib.h memlib.c
“API”
29
![Page 30: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/30.jpg)
Computer ScienceScience
#include "memlib.h"
int main(int argc, char **argv){ /* Initialize the simulated memory system in memlib.c */ mem_init(); /* Evaluate student's mm malloc package using the K-best scheme */ for (i=0; i < num_tracefiles; i++) { ... } ...}
“API”
memlib.hvoid mem_init(void);void mem_deinit(void);void *mem_sbrk(int incr);void mem_reset_brk(void);void *mem_heap_lo(void);void *mem_heap_hi(void);size_t mem_heapsize(void);size_t mem_pagesize(void);
main.c
30
![Page 31: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/31.jpg)
Computer ScienceScience
§Compilation
31
![Page 32: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/32.jpg)
Computer ScienceScience
$ gcc -o demo hello.c$ ./demoHello world!$
int main () { printf("Hello world!\n"); return 0;}
32
![Page 33: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/33.jpg)
Computer ScienceScience
Compilation
Preprocessing
Assembly
Linking
Loading
33
![Page 34: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/34.jpg)
Computer ScienceScience
Compilation
Preprocessing
Assembly
Linking
Loading
34
![Page 35: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/35.jpg)
Computer ScienceScience
“Preprocessing”- preprocessor directives exist for:
- text substitution
- macros
- conditional compilation
35
![Page 36: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/36.jpg)
Computer ScienceScience
$ gcc -E hello.c
int main () { printf("Hello world!\n"); return 0;}
#define msg "Hello world!\n"
int main () { printf(msg); return 0;}
36
![Page 37: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/37.jpg)
Computer ScienceScience
$ gcc -E plus1.c
int main () { int y; y = y * (y+1); return 0;}
#define PLUS1(x) (x+1)
int main () { int y; y = y * PLUS1(y); return 0;}
37
![Page 38: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/38.jpg)
Computer ScienceScience
$ gcc -E hello.c
int main () { printf("Hi!"); return 0;}
#define SAYHI
int main () {#ifdef SAYHI printf("Hi!");#else printf("Bye!");#endif return 0;}
38
![Page 39: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/39.jpg)
Computer ScienceScience
“Linking”- Resolving calls/references and
definitions
- e.g., putting absolute/relative addresses in the (assembly) call instruction
- Note: dynamic linking is also possible (link in shared library at run-time)
39
![Page 40: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/40.jpg)
Computer ScienceScience
“Linking”- But!
- Don’t always want to allow linking a call to a definition
- e.g., to hide implementation
- Want to support selective public APIs
40
![Page 41: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/41.jpg)
Computer ScienceScience
“Linking”- But!
- Also, how to separate declaration & definition of a variable? (and why?)
41
![Page 42: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/42.jpg)
Computer ScienceScience
§Visibility & Lifetime
42
![Page 43: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/43.jpg)
Computer ScienceScience
Visibility: where can a symbol (var/fn) be seen from, and how do we refer to it?
Lifetime: how long does allocated storage space (e.g., for a var) remain useable?
43
![Page 44: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/44.jpg)
Computer ScienceScience
int glob_i = 0;
int main() { int i = 10; glob_i = 10; foo(); printf("%d, %d\n", i, glob_i); return 0;}
void foo() { i++; glob_i++;}
$ gcc -Wall -o demo viz_life.cviz_life.c: In function ‘main’:viz_life.c:6: warning: implicit declaration of function ‘foo’viz_life.c:7: warning: implicit declaration of function ‘printf’viz_life.c:7: warning: incompatible implicit declaration of built-in function ‘printf’viz_life.c: At top level:viz_life.c:11: warning: conflicting types for ‘foo’viz_life.c:6: warning: previous implicit declaration of ‘foo’ was hereviz_life.c: In function ‘foo’:viz_life.c:12: error: ‘i’ undeclared (first use in this function)viz_life.c:12: error: (Each undeclared identifier is reported only onceviz_life.c:12: error: for each function it appears in.)
1 2 3 4 5 6 7 8 91011121314
44
![Page 45: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/45.jpg)
Computer ScienceScience#include <stdio.h>
void foo();
int glob_i = 0;
int main() { int i = 10; glob_i = 10; foo(); printf("%d, %d\n", i, glob_i); return 0;}
void foo() { int i; i++; glob_i++;}
$ gcc -Wall -o demo viz_life.c$ ./demo10, 11
45
![Page 46: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/46.jpg)
Computer ScienceScience
$ gcc -Wall -o demo sum.c main.csum.c: In function `sumWithI':sum.c:2: error: `I' undeclared (first use in this function)main.c: In function `main':main.c:6: warning: implicit declaration of function `sumWithI'
sum.cint sumWithI(int x, int y) { return x + y + I;}
main.c#include <stdio.h>
int I = 10;
int main() { printf("%d\n", sumWithI(1, 2)); return 0;}
46
![Page 47: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/47.jpg)
Computer ScienceScience
int sumWithI(int x, int y) { int I; return x + y + I;}
#include <stdio.h>
int sumWithI(int, int);
int I = 10;
int main() { printf("%d\n", sumWithI(1, 2)); return 0;}
$ gcc -Wall -o demo sum.c main.c$ ./demo-1073743741
main.csum.c
47
![Page 48: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/48.jpg)
Computer ScienceScience
problem: variable declaration & definition are implicitly tied together
note: definition = storage allocation + possible initialization
48
![Page 49: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/49.jpg)
Computer ScienceScience
extern keyword allows for declaration sans definition
49
![Page 50: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/50.jpg)
Computer ScienceScience
int sumWithI(int x, int y) { extern int I; return x + y + I;}
#include <stdio.h>
int sumWithI(int, int);
int I = 10;
int main() { printf("%d\n", sumWithI(1, 2)); return 0;}
$ gcc -Wall -o demo sum.c main.c$ ./demo13
main.csum.c
50
![Page 51: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/51.jpg)
Computer ScienceScience
… and now global variables are visible from everywhere.
Good/Bad?
51
![Page 52: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/52.jpg)
Computer ScienceScience
static keyword lets uslimit the visibility of things
52
![Page 53: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/53.jpg)
Computer ScienceScience
int sumWithI(int x, int y) { extern int I; return x + y + I;}
#include <stdio.h>
int sumWithI(int, int);
static int I = 10;
int main() { printf("%d\n", sumWithI(1, 2)); return 0;}
$ gcc -Wall -o demo sum.c main.cUndefined symbols: "_I", referenced from: _sumWithI in ccmvi0RF.old: symbol(s) not foundcollect2: ld returned 1 exit status
main.csum.c
53
![Page 54: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/54.jpg)
Computer ScienceScience
static int sumWithI(int x, int y) { extern int I; return x + y + I;}
#include <stdio.h>
int sumWithI(int, int);
int I = 10;
int main() { printf("%d\n", sumWithI(1, 2)); return 0;}
$ gcc -Wall -o demo sum.c main.cUndefined symbols: "_sumWithI", referenced from: _main in cc9LhUBP.old: symbol(s) not foundcollect2: ld returned 1 exit status
main.csum.c
54
![Page 55: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/55.jpg)
Computer ScienceScience
static also forces the lifetime of variables to be equivalent to global
(i.e., stored in static memory vs. stack)
55
![Page 56: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/56.jpg)
Computer ScienceScience
int sumWithI(int x, int y) { static int I = 10; // init once return x + y + I++;}
#include <stdio.h>
int sumWithI(int, int);
int main() { printf("%d\n", sumWithI(1, 2)); printf("%d\n", sumWithI(1, 2)); printf("%d\n", sumWithI(1, 2)); return 0;}
$ gcc -Wall -o demo sum.c main.c$ ./demo131415
main.csum.c
56
![Page 57: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/57.jpg)
Computer ScienceScience
recap:
- by default, variable declaration also results in definition (storage allocation)
- extern is used to declare a variable but use a separate definition
57
![Page 58: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/58.jpg)
Computer ScienceScience
recap:
- by default, functions & global vars are visible within all linked files
- static lets us limit the visibility of symbols to the defining file
58
![Page 59: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/59.jpg)
Computer ScienceScience
recap:
- by default, variables declared inside functions have local lifetimes (stack-bound)
- static lets us change their storage class to static (aka “global”)
59
![Page 60: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/60.jpg)
Computer ScienceScience
§Pointers
60
![Page 61: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/61.jpg)
Computer ScienceScience
(don’t panic!)
61
![Page 62: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/62.jpg)
Computer ScienceScience
a pointer is a variable declared to store a memory address
62
![Page 63: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/63.jpg)
Computer ScienceScience
what’s a memory address?
- an address that can refer to a datum in memory
- width determined by machine word size
- e.g., 32-bit machine → 32-bit address
63
![Page 64: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/64.jpg)
Computer ScienceScience
given address size w, range = 0 to 2w-1
64
![Page 65: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/65.jpg)
Computer ScienceScience
e.g., for word size = 32, the following are valid memory addresses:
-0
-100
-0xABCD1234
-0xFFFFFFFF
65
![Page 66: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/66.jpg)
Computer ScienceScience
i.e., an address is just a number
66
![Page 67: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/67.jpg)
Computer ScienceScience
Q: by examining a variable’s contents, can we tell if the variable is a pointer?
0x0040B100e.g.,
67
![Page 68: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/68.jpg)
Computer ScienceScience
No!
- a pointer is designated by its static (declared) type, not its contents
68
![Page 69: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/69.jpg)
Computer ScienceScience
A pointer declaration also tells us the type of data to which it should point
69
![Page 70: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/70.jpg)
Computer ScienceScience
declaration syntax: type *var_name
70
![Page 71: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/71.jpg)
Computer ScienceScience
struct student *sp;
int *ip
char *cp;
intintint
char
struct studentstruct studentstruct student
71
![Page 72: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/72.jpg)
Computer ScienceScience
Important pointer-related operators:
& :address-of
* : dereference (not the same as the * used for declarations!!!)
72
![Page 73: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/73.jpg)
Computer ScienceScience
Class Operator Associativity
-() [] . ->
expr++ expr-- left-to-right
Unary& * + - ! ~ ++expr --expr right-to-left
Binary arithmetic (incl. *), relational, logical
left-to-right
Ternary ?: (conditional) right-to-left
Assignment = += -= ... left-to-right
Operator precedence
73
![Page 74: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/74.jpg)
Computer ScienceScience
int i = 5; /* i is an int containing 5 */int *p; /* p is a pointer to an int */
p = &i; /* store the address of i in p */
int j; /* j is an uninitialized int */j = *p; /* store the value p points to into j*/
74
![Page 75: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/75.jpg)
Computer ScienceScience
int main() { int i, j; int *p, *q; i = 10; p = j;
return 0;}
$ gcc pointers.c pointers.c: In function ‘main’:pointers.c:5: warning: assignment makes pointer from integer without a cast
1 2 3 4 5 6 7 8
75
![Page 76: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/76.jpg)
Computer ScienceScience
int main() { int i, j, *p, *q;
i = 10; p = &j; q = *p;
return 0;}
$ gcc pointers.c pointers.c: In function ‘main’:pointers.c:6: warning: assignment makes pointer from integer without a cast
1 2 3 4 5 6 7 8 9
76
![Page 77: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/77.jpg)
Computer ScienceScience
int main() { int i, j, *p, *q;
i = 10; p = &j; q = &p;
return 0;}
$ gcc pointers.c pointers.c: In function ‘main’:pointers.c:6: warning: assignment from incompatible pointer type
1 2 3 4 5 6 7 8 9
77
![Page 78: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/78.jpg)
Computer ScienceScience
int main() { int i, j, *p, *q;
i = 10; p = &j; q = p; *q = *i;
return 0;}
$ gcc pointers.cpointers.c: In function ‘main’:pointers.c:7: error: invalid type argument of ‘unary *’
1 2 3 4 5 6 7 8 910
78
![Page 79: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/79.jpg)
Computer ScienceScience
int main() { int i, j, *p, *q;
i = 10; p = &j; q = p; *q = i; j = q;
return 0;}
$ gcc pointers.cpointers.c: In function ‘main’:pointers.c:8: warning: assignment makes integer from pointer without a cast
1 2 3 4 5 6 7 8 91011
79
![Page 80: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/80.jpg)
Computer ScienceScience
$ gcc pointers.c $ ./a.outi=10, j=20, *p=20, *q=20
int main() { int i, j, *p, *q;
i = 10; p = &j; q = p; *q = i; *p = (*q) * 2; printf("i=%d, j=%d, *p=%d, *q=%d\n", i, j, *p, *q); return 0;}
1 2 3 4 5 6 7 8 91011
80
![Page 81: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/81.jpg)
Computer ScienceScience
10
?
?
?
1000
1004
1008
1012
Address Data
(i)
(j)
(p)
(q)
int i, j, *p, *q;i = 10;
10
?
1004
1004
1000
1004
1008
1012
Address Data
(i)
(j,*p,*q)
(p)
(q)
10
?
1004
?
1000
1004
1008
1012
Address Data
(i)
(j,*p)
(p)
(q)
10
10
1004
1004
1000
1004
1008
1012
Address Data
(i)
(j,*p,*q)
(p)
(q)
10
20
1004
1004
1000
1004
1008
1012
Address Data
(i)
(j,*p,*q)
(p)
(q)
p = &j; q = p;
*q = i; *p = (*q) * 2;
81
![Page 82: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/82.jpg)
Computer ScienceScience
why have pointers?
82
![Page 83: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/83.jpg)
Computer ScienceScience
int main() { int a = 5, b = 10; swap(a, b); /* want a == 10, b == 5 */ ...}
void swap(int x, int y) { int tmp = x; x = y; y = tmp;}
83
![Page 84: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/84.jpg)
Computer ScienceScience
int main() { int a = 5, b = 10; swap(&a, &b); /* want a == 10, b == 5 */ ...}
void swap(int *p, int *q) { int tmp = *p; *p = *q; *q = tmp;}
84
![Page 85: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/85.jpg)
Computer ScienceScience
public class Container { int x, y;
public static void swap (Container c) { int tmp = c.x; c.x = c.y; c.y = tmp; }
public static void main (String[] args) { Container c = new Container(); c.x = 5; c.y = 10; swap(c); System.out.printf("c.x=%d; c.y=%d\n", c.x, c.y); }}
$ javac Container.java$ java Container c.x=10; c.y=5
in Java ...
85
![Page 86: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/86.jpg)
Computer ScienceScience
Java is inconsistent in how arguments are passed to methods
- primitives are passed by-value (copy)
- objects are not copied, instead, we pass references to objects
86
![Page 87: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/87.jpg)
Computer ScienceScience
in C, args are always passed by-value
i.e., we always pass copies of args
87
![Page 88: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/88.jpg)
Computer ScienceScience
# Python example: returning multiple values
from math import sqrt
def quad_roots(a, b, c): discr = b*b - 4*a*c if discr < 0: return (None, None) # no real roots r1 = (-b + sqrt(discr)) / 2*a r2 = (-b - sqrt(discr)) / 2*a return (r1, r2)
x0, x1 = quad_roots(1, 3, 2)print("root 1 =", x0, "; root 2 = ", x1)
$ python qroots.py root 1 = -1.0 , root 2 = -2.0
88
![Page 89: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/89.jpg)
Computer ScienceScience
/* now in C */
#include <math.h>
double quad_roots(double a, double b, double c) { double discr = b*b - 4*a*c; if (discr < 0) return /* ?!? */; double r1 = (-b + sqrt(discr)) / 2*a; double r2 = (-b - sqrt(discr)) / 2*a; return /* ?!? */;}
89
![Page 90: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/90.jpg)
Computer ScienceScience
$ gcc -o qroots qroots.c$ ./qrootsroot 1 = -1.0; root 2 = -2.0
/* now in C */
#include <math.h>
int quad_roots(double a, double b, double c, double *pr1, double *pr2) { double discr = b*b - 4*a*c; if (discr < 0) return 0; /* no real roots */ *pr1 = (-b + sqrt(discr)) / 2*a; *pr2 = (-b - sqrt(discr)) / 2*a; return 1;}
int main() { double x0, x1; if (quad_roots(1, 3, 2, &x0, &x1)) printf("root 1 = %0.1f; root 2 = %0.1f\n", x0, x1); return 0;}
90
![Page 91: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/91.jpg)
Computer ScienceScience
$ gcc -o qroots qroots.c$ ./qrootsroot 1 = -1.0; root 2 = -2.0
/* now in C */
#include <math.h>
int quad_roots(double a, double *b_r1, double *c_r2) { double b = *b_r1, c = *c_r2; double discr = b*b - 4*a*c; if (discr < 0) return 0; /* no real roots */ *b_r1 = (-b + sqrt(discr)) / 2*a; *c_r2 = (-b - sqrt(discr)) / 2*a; return 1;}
int main() { double x0=3, x1=2; /* x0 & x1 are value-return args */ if (quad_roots(1, &x0, &x1)) printf("root 1 = %0.1f; root 2 = %0.1f\n", x0, x1); return 0;}
91
![Page 92: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/92.jpg)
Computer ScienceScience
(now forget you ever saw that last slide)
92
![Page 93: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/93.jpg)
Computer ScienceScience
pointers enable action at a distance
93
![Page 94: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/94.jpg)
Computer ScienceScience
void bar(int *p) { *p = ...; /* change some remote var! */}
void bat(int *p) { bar(p);}
void baz(int *p) { bat(p);}
int main() { int i; baz(&i); return 0;}
94
![Page 95: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/95.jpg)
Computer ScienceScience
action at a distance is an anti-pattern
i.e., an oft used but typically crappy programming solution
95
![Page 96: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/96.jpg)
Computer ScienceScience
note: moral is not “don’t use pointers”;it’s “don’t use pointers unthinkingly”
96
![Page 97: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/97.jpg)
Computer ScienceScience
back to swap
int main() { int a = 5, b = 10; swap(&a, &b); /* want a == 10, b == 5 */ ...}
void swap(int *p, int *q) { int tmp = *p; *p = *q; *q = tmp;}
97
![Page 98: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/98.jpg)
Computer ScienceScience
… for swapping pointers?void swap(int *p, int *q) { int tmp = *p; *p = *q; *q = tmp;}
int main() { int a, b, *p, *q; p = &a; q = &b; swap(p, q); /* want p to point to b, q to a */ ...}
98
![Page 99: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/99.jpg)
Computer ScienceScience
problem: can’t change value of p or q inside swap … (same problem as before)
solution: pass pointers to p and q
99
![Page 100: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/100.jpg)
Computer ScienceScience
$ gcc pointers.cpointers.c: In function ‘main’:pointers.c:10: warning: passing argument 1 of ‘swap’ from incompatible pointer typepointers.c:10: warning: passing argument 2 of ‘swap’ from incompatible pointer type
void swap(int *p, int *q) { int tmp = *p; *p = *q; *q = tmp;}
int main() { int a, b, *p = &a, *q = &b; swap(&p, &q); /* want p to point to b, q to a */}
100
![Page 101: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/101.jpg)
Computer ScienceScience
(int **) declares a pointer to a pointer to an int
void swapp(int **p, int **q) { int *tmp = *p; *p = *q; *q = tmp;}
int main() { int a, b, *p = &a, *q = &b; swapp(&p, &q); /* want p to point to b, q to a */}
101
![Page 102: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/102.jpg)
Computer ScienceScience
can we write a generic swap function in C?
kind of … but not that easily! (see later)
/* swaps values in `int` vars */void swap(int *p, int *q) { int tmp = *p; *p = *q; *q = tmp;}
/* swaps values in `int *` vars */void swapp(int **p, int **q) { int *tmp = *p; *p = *q; *q = tmp;}
102
![Page 103: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/103.jpg)
Computer ScienceScience
- are like all other uninitialized variables
- i.e., contain garbage
- dereferencing garbage ...
- if lucky → crash
- if unlucky → ???
Uninitialized pointers
103
![Page 104: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/104.jpg)
Computer ScienceScience
“Null” pointers- never returned by & operator
- safe to use as sentinel value
- written as 0 as in pointer context
- for convenience, #define’d as NULL
104
![Page 105: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/105.jpg)
Computer ScienceScience
“Null” pointersint main() { int i = 0; int *p = NULL; ... if (p) { /* (likely) safe to deref p */ }}
105
![Page 106: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/106.jpg)
Computer ScienceScience
“Null” pointersvoid foo(char *first, ...);
int main() { /* explicit typecast to establish pointer context */ foo("var", "args", "terminated", "with", (char *)0); return 0;}
106
![Page 107: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/107.jpg)
Computer ScienceScience
- ASCII “null zero” — used to terminate strings (as last char)
- Written '\0'
- Numerical value = 0
- Don’t get confused!
The other “null”
107
![Page 108: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/108.jpg)
Computer ScienceScience
§Arrays
108
![Page 109: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/109.jpg)
Computer ScienceScience
contiguous, indexed region of memory
109
![Page 110: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/110.jpg)
Computer ScienceScience
Declaration: type arr_name[size]
- remember, declaration also allocates storage!
110
![Page 111: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/111.jpg)
Computer ScienceScience
int i_arr[10]; /* array of 10 ints */char c_arr[80]; /* array of 80 chars */char td_arr[24][80]; /* 2-D array, 24 rows x 80 cols */int *ip_arr[10]; /* array of 10 pointers to ints */
/* dimension can be inferred if initialized when declaring */short grades[] = { 75, 90, 85, 100 };
/* can also use designated initializers for specific indices*/int nifty[100] = { [0] = 0, [99] = 1000, [49] = 250 };
/* if partially initialized, remaining components are 0 */int zeros[1000] = { 0 };
/* can only omit first dim, as partial initialization is ok */int sparse[][10] = { { 5, 3, 2 }, { 8, 10 }, { 2 } };
111
![Page 112: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/112.jpg)
Computer ScienceScience
In C, arrays contain no metadata
i.e., no implicit size, no bounds checking
112
![Page 113: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/113.jpg)
Computer ScienceScience
int main() { int i, arr[10]; for (i=0; i<100; i++) { arr[i] = 0; } printf("Done\n"); return 0;}
$ gcc arr.c$ ./a.out
(runs forever ... no output)
ret. address
old frame ptr.
i
arr
stack
113
![Page 114: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/114.jpg)
Computer ScienceScience
$ gcc arr.c$ ./a.out Done[1] 10287 segmentation fault ./a.out$
int main() { int arr[10], i; for (i=0; i<100; i++) { arr[i] = 0; } printf("Done\n"); return 0;}
ret. address
old frame ptr.
arr
i
stack
114
![Page 115: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/115.jpg)
Computer ScienceScience
direct access to memory can be dangerous!
115
![Page 116: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/116.jpg)
Computer ScienceScience
pointers ♥ arrays
- an array name is bound to the address of its first element
- i.e., array name is a const pointer
- conversely, a pointer can be used as though it were an array name
116
![Page 117: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/117.jpg)
Computer ScienceScience
int *pa;int arr[5];
pa = &arr[0]; /* <=> */ pa = arr;
arr[i]; /* <=> */ pa[i];
*arr; /* <=> */ *pa;
int i;
pa = &i; /* ok */
arr = &i; /* not possible! */
117
![Page 118: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/118.jpg)
Computer ScienceScience
int main() { int i, j, k, *p, mat[5][5];
$ ./a.out 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
k=0; for (i=0; i<5; i++) { for (j=0; j<5; j++) { mat[i][j] = k++; } }
for (i=0; i<25; i++) { printf("%d ", p[i]); }}
p = (int *)mat; /* `p` is a 1-D view of a 2-D array */
118
![Page 119: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/119.jpg)
Computer ScienceScience
$ $ ./a.out 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
int main() { int i, j; int mat[25]; for (i=0; i<25; i++) { mat[i] = i; } for (i=0; i<5; i++) { for (j=0; j<5; j++) { /* treat `mat` as a multi-dim array of 5x5 ints */ printf("%2d ", ((int (*)[5])mat)[i][j]); } printf("\n"); }}
119
![Page 120: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/120.jpg)
Computer ScienceScience
§Pointer Arithmetic
120
![Page 121: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/121.jpg)
Computer ScienceScience
follows naturally from allowing array subscript notation on pointers
121
![Page 122: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/122.jpg)
Computer ScienceScience
int *pa;int arr[100];
pa = arr;
pa[10] = 0; /* set tenth element */
/* so it follows ... */
*(pa + 10) = 0; /* set tenth element */
/* surprising! "adding" to a pointer accounts for element size -- does not blindly increment address */
122
![Page 123: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/123.jpg)
Computer ScienceScience
char *pa;int arr[100];arr[10] = 0xDEADBEEF;
pa = (char *)arr; /* explicit typecast */
pa[10] = 0; /* set tenth char */
*(pa + 10) = 0; /* set tenth char */
printf("%X\n", arr[10]);
$ ./a.outDEADBEEF
123
![Page 124: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/124.jpg)
Computer ScienceScience
char *pa;int arr[100], offset;arr[10] = 0xDEADBEEF;
pa = (char *)arr;
offset = 10 * sizeof (int);
*(pa + offset) = 0;
printf("%X\n", arr[10]);
$ ./a.outDEADBE00
124
![Page 125: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/125.jpg)
Computer ScienceScience
char *pa;int arr[100], offset;arr[10] = 0xDEADBEEF;
pa = (char *)arr;
offset = 10 * sizeof (int);
*(int *)(pa + offset) = 0;
printf("%X\n", arr[10]);
$ ./a.out0
125
![Page 126: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/126.jpg)
Computer ScienceScience
sizeof: an operator to get the size in bytes
- can be applied to a datum or type
126
![Page 127: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/127.jpg)
Computer ScienceScience
int i, *p, arr[10];char c, *str = "hello";double d;
printf("sizeof i = %lu\n", sizeof i);printf("sizeof p = %lu\n", sizeof p);printf("sizeof arr = %lu\n", sizeof arr);printf("sizeof c = %lu\n", sizeof c);printf("sizeof str = %lu\n", sizeof str);printf("sizeof d = %lu\n", sizeof d);
sizeof i = 4sizeof p = 8sizeof arr = 40sizeof c = 1sizeof str = 8sizeof d = 8
printf("sizeof (int) = %lu\n", sizeof (int));printf("sizeof (int *) = %lu\n", sizeof (int *));printf("sizeof (int [10]) = %lu\n", sizeof (int [10]));printf("sizeof (char) = %lu\n", sizeof (char));printf("sizeof (char *) = %lu\n", sizeof (char *));printf("sizeof (double) = %lu\n", sizeof (double));
sizeof (int) = 4sizeof (int *) = 8sizeof (int [10]) = 40sizeof (char) = 1sizeof (char *) = 8sizeof (double) = 8
127
![Page 128: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/128.jpg)
Computer ScienceScience
/* Beware! */
void foo(char *p) { printf("In foo, sizeof p = %lu\n", sizeof p); printf("In foo, sizeof *p = %lu\n", sizeof *p);}
int main() { char str[80]; printf("In main, sizeof str = %lu\n", sizeof str); foo(str); return 0;}
In main, sizeof str = 80In foo, sizeof p = 8In foo, sizeof *p = 1
128
![Page 129: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/129.jpg)
Computer ScienceScience
when “passed” as arguments, arrays degenerate into pointers
i.e., no aggregate size information!
129
![Page 130: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/130.jpg)
Computer ScienceScience
/* alt syntax for param `p` is valid, but misleading ... `p` is a pointer in `foo`, not an array! */void foo(char p[]) { printf("In foo, sizeof p = %lu\n", sizeof p);}
int main() { char str[80]; printf("In main, sizeof str = %lu\n", sizeof str); foo(str); return 0;}
In main, sizeof str = 80In foo, sizeof p = 8
130
![Page 131: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/131.jpg)
Computer ScienceScience
more pointer arithmetic:
- +/– by x: move forward/back x elements
- </≤/≥/>: which element is first?
- difference (p1–p2): # elements apart
131
![Page 132: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/132.jpg)
Computer ScienceScience
double arr[] = { 12.5, 1.0, 0.0, 5.2, 3.5 }, *p = &arr[0], *q = &arr[2];
printf("%d\n", p < q);printf("%ld\n", q - p);q += 2;printf("%.1f\n", *q);
/* => 1 *//* => 2 */
/* => 3.5 */
132
![Page 133: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/133.jpg)
Computer ScienceScience
strings are just 0 terminated char arrays
133
![Page 134: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/134.jpg)
Computer ScienceScience
char str[] = "hello!";char *p = "hi";char tarr[][5] = {"max", "of", "four"};char *sarr[] = {"variable", "length", "strings"};
134
![Page 135: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/135.jpg)
Computer ScienceScience
/* printing a string (painfully) */
int i;char *str = "hello world!";for (i = 0; str[i] != 0; i++) { printf("%c", str[i]);}
/* or just */
printf("%s", str);
135
![Page 136: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/136.jpg)
Computer ScienceScience
/* Beware: */
int main() { char *str = "hello world!"; str[12] = 10; printf("%s", str); return 0;}
$ ./a.out [1] 10522 bus error ./a.out
136
![Page 137: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/137.jpg)
Computer ScienceScience
/* the fleshed out "main" with command-line args */
int main(int argc, char *argv[]) { int i; for (i=0; i<argc; i++) { printf("%s", argv[i]); printf("%s", ((i < argc-1)? ", " : "\n") ); } return 0;}
$ ./a.out testing one two three./a.out, testing, one, two, three
137
![Page 138: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/138.jpg)
Computer ScienceScience
e.g., strcpy: copy chars from source to dest array (including terminating 0)
138
![Page 139: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/139.jpg)
Computer ScienceScience
void strcpy(char dst[], char src[]) { int i=0; while ((dst[i] = src[i]) != '\0') i++;}
139
![Page 140: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/140.jpg)
Computer ScienceScience
void strcpy(char *dst, char *src) { while ((*dst = *src) != '\0') { dst++; src++; }}
140
![Page 141: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/141.jpg)
Computer ScienceScience
void strcpy(char *dst, char *src) { while ((*dst++ = *src++) != '\0') ;}
141
![Page 142: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/142.jpg)
Computer ScienceScience
void strcpy(char *dst, char *src) { while (*dst++ = *src++) ;}
142
![Page 143: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/143.jpg)
Computer ScienceScience
/* actually ... */char *strcpy(char *restrict dst, const char *restrict src) { char *ret = dst; while (*dst++ = *src++) ; return ret;}
143
![Page 144: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/144.jpg)
Computer ScienceScience
miscellaneous modifiers:
- const; e.g., const int *p
- data pointed to won’t be modified
- not the same as int *const p
- restrict; e.g., int *restrict p
- no other pointer refers to this data
144
![Page 145: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/145.jpg)
Computer ScienceScience
<string.h>strcpy, strcat
strcmp, strlen, strchrmemcpy, memmove, ...
145
![Page 146: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/146.jpg)
Computer ScienceScience
e.g., clone: allocate and return a copy of a given string
146
![Page 147: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/147.jpg)
Computer ScienceScience
char *clone(const char *str) { char buf[strlen(str) + 1]; /* not pretty */ strcpy(buf, str); return buf;}
/* NO! */
char *clone(const char *str) { static char buf[BUF_LEN]; /* global buf */ static char *p = buf; /* track position */ int nbytes = strlen(str) + 1; char *rp = p;
if (p + nbytes > &buf[BUF_LEN]) return 0; /* fail if buf full */ strcpy(p, str); p += nbytes; return rp;}
147
![Page 148: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/148.jpg)
Computer ScienceScience
§Dynamic Memory Allocation
148
![Page 149: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/149.jpg)
Computer ScienceScience
dynamicvs. static (lifetime = forever)
vs. local (lifetime = LIFO)
149
![Page 150: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/150.jpg)
Computer ScienceScience
C requires explicit memory management
- must request & free memory manually
- if forget to free → memory leak
150
![Page 151: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/151.jpg)
Computer ScienceScience
vs., e.g., Java, which has implicit memory management via garbage collection
- allocate (via new) & forget!
151
![Page 152: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/152.jpg)
Computer ScienceScience
basic C “malloc” API (in stdlib.h):
-malloc
-realloc
-free
152
![Page 153: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/153.jpg)
Computer ScienceScience
malloc lib is type agnostic
i.e., it doesn’t care what data types we store in requested memory
153
![Page 154: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/154.jpg)
Computer ScienceScience
need a “generic” / type-less pointer:
(void *)
154
![Page 155: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/155.jpg)
Computer ScienceScience
assigning from/to (void *) to/from any other pointer will never produce warnings
… Hurrah! (but dangerous)
155
![Page 156: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/156.jpg)
Computer ScienceScience
void *malloc(size_t size);
void *realloc(void *ptr, size_t size);
void free(void *ptr);
all sizes are in bytes;
all ptrs are from previous malloc requests
156
![Page 157: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/157.jpg)
Computer ScienceScience
/* clone into dynamically alloc’d memory */char *clone(const char *str) { char *nstr = malloc(strlen(str) + 1); strcpy(nstr, str); return nstr; /* someone else must free this! */}
/* one way to do a "generic" swap */void swap(void *p, void *q, int size) { void *tmp = malloc(size); memcpy(tmp, p, size); memcpy(p, q, size); memcpy(q, tmp, size); free(tmp);}
157
![Page 158: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/158.jpg)
Computer ScienceScience
int i, j, k=1;int *jagged_arr[5]; /* array of 5 pointers to int */
1
2 2
3 3 3
4 4 4 4
5 5 5 5 5
for (i=0; i<5; i++) { jagged_arr[i] = malloc(sizeof(int) * k); for (j=0; j<k; j++) { jagged_arr[i][j] = k; } k += 1;}
/* use jagged_arr ... */
for (i=0; i<5; i++) { free(jagged_arr[i]);}
158
![Page 159: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/159.jpg)
Computer ScienceScience
int i, j, k=1;int *jagged_arr[5]; /* array of 5 pointers to int */for (i=0; i<5; i++) { jagged_arr[i] = malloc(sizeof(int) * k); for (j=0; j<k; j++) { jagged_arr[i][j] = k; } k += 1;}
(gdb) runStarting program: /Users/lee/demo/a.out Breakpoint 1, main () at demo.c:18(gdb) p jagged_arr $1 = {0x1001000e0, 0x100103ad0, 0x100103ae0, 0x100103af0, 0x100103b00}(gdb) p jagged_arr[0][0]$2 = 1(gdb) p *jagged_arr[0]$3 = 1(gdb) p *(int (*) [5])jagged_arr[4]$4 = {5, 5, 5, 5, 5}
159
![Page 160: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/160.jpg)
Computer ScienceScience
what if first dimension (num of “rows”) of jagged array isn’t known?
160
![Page 161: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/161.jpg)
Computer ScienceScience
int **make_jagged_arr(int nrows, const int *dims) { int i, j; int **jarr = malloc(sizeof(int *) * nrows); for (i=0; i<nrows; i++) { jarr[i] = malloc(sizeof(int) * dims[i]); for (j=0; j<dims[i]; j++) jarr[i][j] = 0xDEADBEEF; /* for testing */ } return jarr;}
void free_jagged_arr(int **jarr, int nrows) { int i; for (i=0; i<nrows; i++) free(jarr[i]); free(jarr);}
int main() { int **jarr = make_jagged_arr(5, (int [5]){3, 4, 2, 1, 8});
/* use jarr ... */
free_jagged_arr(jarr, 5);}
161
![Page 162: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/162.jpg)
Computer ScienceScience
int main() { int **jarr = make_jagged_arr(5, (int [5]){3, 4, 2, 1, 8});
/* use jarr ... */
free_jagged_arr(jarr, 5);}
(gdb) break mainBreakpoint 1 at 0x100000e44: file demo.c, line 26.(gdb) runStarting program: /Users/lee/demo/a.out Breakpoint 1, main () at syntax.c:2626 int **jarr = make_jagged_arr(5, (int [5]){3, 4, 2, 1, 8});(gdb) next27 free_jagged_arr(jarr, 5);(gdb) p (int *[5])*jarr$1 = {0x1001000e0, 0x100103b00, 0x100103b10, 0x100103b20, 0x100103b30}(gdb) p /x *(int (*) [2])jarr[3]$2 = {0xdeadbeef, 0x0}(gdb) p /x *(int (*) [4])jarr[1]$9 = {0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef}
162
![Page 163: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/163.jpg)
Computer ScienceScience
golden rule of memory management:
for every malloc, you must have a corresponding free!
int **make_jagged_arr(int nrows, const int *dims) { int i, j; int **jarr = malloc(sizeof(int *) * nrows); for (i=0; i<nrows; i++) { jarr[i] = malloc(sizeof(int) * dims[i]); } return jarr;}
void free_jagged_arr(int **jarr, int nrows) { int i; for (i=0; i<nrows; i++) free(jarr[i]); free(jarr);}
163
![Page 164: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/164.jpg)
Computer ScienceScience
very handy tool for detecting/debugging memory leaks: valgrind
164
![Page 165: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/165.jpg)
Computer ScienceScience
int **make_jagged_arr(int nrows, const int *dims) { ... }
void free_jagged_arr(int **jarr, int nrows) { int i; for (i=0; i<nrows; i++) free(jarr[i]); /* free(jarr); */}
int main() { int **jarr = make_jagged_arr(5, (int [5]){3, 4, 2, 1, 8}); free_jagged_arr(jarr, 5);}
$ valgrind ./a.out ==23535== HEAP SUMMARY:==23535== in use at exit: 40 bytes in 1 blocks==23535== total heap usage: 6 allocs, 5 frees, 112 bytes allocated==23535== ==23535== LEAK SUMMARY:==23535== definitely lost: 40 bytes in 1 blocks==23535== indirectly lost: 0 bytes in 0 blocks==23535== possibly lost: 0 bytes in 0 blocks==23535== still reachable: 0 bytes in 0 blocks==23535== suppressed: 0 bytes in 0 blocks
165
![Page 166: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/166.jpg)
Computer ScienceScience
int **make_jagged_arr(int nrows, const int *dims) { ... }
void free_jagged_arr(int **jarr, int nrows) { int i; /* for (i=0; i<nrows; i++) free(jarr[i]); */ free(jarr);}
int main() { int **jarr = make_jagged_arr(5, (int [5]){3, 4, 2, 1, 8}); free_jagged_arr(jarr, 5);}
$ valgrind ./a.out ==24106== HEAP SUMMARY:==24106== in use at exit: 72 bytes in 5 blocks==24106== total heap usage: 6 allocs, 1 frees, 112 bytes allocated==24106== ==24106== LEAK SUMMARY:==24106== definitely lost: 72 bytes in 5 blocks==24106== indirectly lost: 0 bytes in 0 blocks==24106== possibly lost: 0 bytes in 0 blocks==24106== still reachable: 0 bytes in 0 blocks==24106== suppressed: 0 bytes in 0 blocks
166
![Page 167: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/167.jpg)
Computer ScienceScience
int **make_jagged_arr(int nrows, const int *dims) { ... }
void free_jagged_arr(int **jarr, int nrows) { int i; free(jarr); for (i=0; i<nrows; i++) free(jarr[i]);}
int main() { int **jarr = make_jagged_arr(5, (int [5]){3, 4, 2, 1, 8}); free_jagged_arr(jarr, 5);}
$ valgrind ./a.out ==25084== 5 errors in context 1 of 1:==25084== Invalid read of size 8==25084== at 0x4005AA: free_jagged_arr (demo.c:19)==25084== by 0x400613: main (demo.c:26)==25084== Address 0x4c29040 is 0 bytes inside a block of size 40 free'd==25084== at 0x4A0595D: free (vg_replace_malloc.c:366)==25084== by 0x400593: free_jagged_arr (demo.c:17)==25084== by 0x400613: main (demo.c:26)==25084== ==25084== HEAP SUMMARY:==25084== in use at exit: 0 bytes in 0 blocks==25084== total heap usage: 6 allocs, 6 frees, 112 bytes allocated==25084== All heap blocks were freed -- no leaks are possible
167
![Page 168: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/168.jpg)
Computer ScienceScience
§Composite Data Types
168
![Page 169: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/169.jpg)
Computer ScienceScience
≈ objects in OOP
169
![Page 170: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/170.jpg)
Computer ScienceScience
C structs create user defined types, based on primitives (and/or other UDTs)
170
![Page 171: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/171.jpg)
Computer ScienceScience
/* type definition */struct point { int x; int y;}; /* the end ';' is required */
/* combined definition & decls */struct point { int x; int y;} pt, *pp;
/* point declaration (& alloc!) */struct point pt;
/* pointer to a point */ struct point *pp;
171
![Page 172: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/172.jpg)
Computer ScienceScience
component access: dot ('.') operator
struct point { int x; int y;} pt, *pp;
int main() { pt.x = 10; pt.y = -5;
struct point pt2 = { .x = 8, .y = 13 }; /* decl & init */
pp = &pt;
(*pp).x = 351; /* comp. access via pointer */
... }
172
![Page 173: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/173.jpg)
Computer ScienceScience
(*pp).x = 351; *pp.x = 351;=?
recall: ‘.’ has higher precedence than ‘*’
$ gcc point.c... error: request for member ‘x’ in something not a structure or union
173
![Page 174: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/174.jpg)
Computer ScienceScience
But (*pp).x is painful
So we have the ‘->’ operator - component access via pointer
struct point { int x; int y;} pt, *pp;
int main() { pp = &pt; pp->x = 10; pp->y = -5; ...}
174
![Page 175: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/175.jpg)
Computer ScienceScience
/* Dynamically allocating structs: */
struct point *parr1 = malloc(N * sizeof(struct point));for (i=0; i<N; i++) { parr1[i].x = parr1[i].y = 0;}
/* or, equivalently, with calloc */struct point *parr2 = calloc(N, sizeof(struct point));
/* do stuff with parr1, parr2 ... */
free(parr1);free(parr2);
175
![Page 176: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/176.jpg)
Computer ScienceScience
sizeof works with structs, too, but with sometimes surprising results:
struct point { int x; int y;};
struct foo { char name[10]; int id; char flag;};
struct point p;struct foo f;
printf("point size = %lu\n", sizeof(struct point));printf("point comps size = %lu\n", sizeof(p.x) + sizeof(p.y));printf("foo size = %lu\n", sizeof(struct foo));printf("foo comps size = %lu\n", sizeof(f.name) + sizeof(f.id) + sizeof(f.flag));
point size = 8point comps size = 8foo size = 20foo comps size = 15
176
![Page 177: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/177.jpg)
Computer ScienceScience
and recall, in C all args are pass-by-value!
void foo(struct point pt) { pt.x = pt.y = 10;}
int main() { struct point mypt = { .x = 5, .y = 15 }; foo(mypt); printf("(%d, %d)\n", mypt.x, mypt.y); return 0;}
(5, 15)
177
![Page 178: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/178.jpg)
Computer ScienceScience
/* self-referential struct */struct ll_node { void *val; struct llnode next;};
$ gcc ll.cll.c:4: error: field ‘next’ has incomplete type
problem: compiler can’t compute size of next — depends on size of ll_node, which depends on size of next, etc.
178
![Page 179: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/179.jpg)
Computer ScienceScience
/* self-referential struct */struct ll_node { void *val; struct llnode *next; /* need a pointer! */};
struct ll_node *make_node(void *val, struct ll_node *next) { struct ll_node *n = malloc(sizeof(struct ll_node)); n->val = val; n->next = next; return n;}
void free_llist(struct ll_node *head) { struct ll_node *p=head, *q; while (p) { q = p->next; free(p); p = q; }}
179
![Page 180: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/180.jpg)
Computer ScienceScience
int main() { struct ll_node *head = make_node("list!", NULL); head = make_node("linked", head); head = make_node("a", head); head = make_node("I'm", head); struct ll_node *p; for (p=head; p; p=p->next) { printf("%s ", (char *)p->val); } free_llist(head); return 0;}
I'm a linked list!
180
![Page 181: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/181.jpg)
Computer ScienceScience
§Function pointers
181
![Page 182: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/182.jpg)
Computer ScienceScience
motivation: functions as values, and higher order functions
182
![Page 183: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/183.jpg)
Computer ScienceScience
> square 525
> map square [1,2,3][1,4,9]
> map (\x -> x*x) [1,2,3][1,4,9]
> map (^2) [1,2,3][1,4,9]
square x = x*x
183
![Page 184: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/184.jpg)
Computer ScienceScience
> even 4True
> map even [1..5][False,True,False,True,False]
compose f g = \x -> f (g x)
even = compose (==0) (`mod` 2)
184
![Page 185: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/185.jpg)
Computer ScienceScience
can’t quite do this in C …
but we can kinda fake it with pointers!
185
![Page 186: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/186.jpg)
Computer ScienceScience
int square(int x) { return x * x;}
int cube(int x) { return x * x * x;}
1001000
int main() { int (*f)(int) = square; printf("%d\n", (*f)(10));
f = cube; printf("%d\n", (*f)(10)); return 0;}
186
![Page 187: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/187.jpg)
Computer ScienceScience
int (*f)(int) … @#&%*!!!
187
![Page 188: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/188.jpg)
Computer ScienceScience
“Spiral Rule”1. Starting with the unknown element, move in a spiral/clockwise
direction; when encountering the following elements replace them with the corresponding english statements:
- [] → array of...
- (t1, t2) → function with args of type t1, t2 returning ...
- * → pointer(s) to ...
2. Keep doing this in a spiral/clockwise direction until all tokens have been covered.
3. Always resolve anything in parentheses first!
http://c-faq.com/decl/spiral.anderson.html
188
![Page 189: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/189.jpg)
Computer ScienceScience
int f
189
![Page 190: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/190.jpg)
Computer ScienceScience
int foo[100]
190
![Page 191: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/191.jpg)
Computer ScienceScience
int *foo[100][20]
191
![Page 192: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/192.jpg)
Computer ScienceScience
int (*foo)[100]
192
![Page 193: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/193.jpg)
Computer ScienceScience
int foo(int, int)
193
![Page 194: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/194.jpg)
Computer ScienceScience
int (*foo)(int *)
194
![Page 195: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/195.jpg)
Computer ScienceScience
char *(*foo[100])(char *)
195
![Page 196: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/196.jpg)
Computer ScienceScience
int square(int x) { return x * x;}
1 4 9 16 25
void map(int (*f)(int), int *arr, int n) { int i; for (i=0; i<n; i++) { arr[i] = (*f)(arr[i]); }}
int main() { int i, arr[] = {1, 2, 3, 4, 5}; map(square, arr, 5); for (i=0; i<5; i++) { printf("%d ", arr[i]); } return 0;}
196
![Page 197: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/197.jpg)
Computer ScienceScience
6
int even_p(int n) { return n % 2 == 0;}
int sum_if(int (*pred)(int), int *arr, int n) { int i, sum = 0; for (i=0; i<n; i++) { if ((*pred)(arr[i])) sum += arr[i]; } return sum;}
int main() { int arr[] = {1, 2, 3, 4, 5}; printf("%d\n", sum_if(even_p, arr, 5)); return 0;}
197
![Page 198: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/198.jpg)
Computer ScienceScience
jmp_buf jbuf;
void handler(int cause) { printf("SEGV arrived.\n"); longjmp(jbuf, 0);}
int main() { int *p; signal(SIGSEGV, handler); while(1) { setjmp(jbuf); printf("I probably shouldn't do this, but ...\n"); p = (int *)random(); printf("*p = %x\n", *p); }}
I probably shouldn't do this, but ...SEGV arrived.I probably shouldn't do this, but ...SEGV arrived.I probably shouldn't do this, but ...SEGV arrived.
198
![Page 199: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/199.jpg)
Computer ScienceScience
#define NUM_SCREENS 3#define NUM_KEYS 12
int kfn_9(int);int kfn_8(int);int kfn_7(int);...int kfn_menu(int);int kfn_sel(int);int kfn_up(int);int kfn_down(int);...
int process_key(int screen, int key, int duration) { static int (*kfn_tab[NUM_SCREENS][NUM_KEYS])(int) = { { kfn_9, kfn_8, kfn_7, kfn_6, ... }, { kfn_menu, kfn_sel, kfn_dial, ... }, { kfn_up, kfn_down, kfn_left, ... } }; return (*kfn_tab[screen][key])(duration);}
199
![Page 200: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/200.jpg)
Computer ScienceScience
§Addendum: typedef
200
![Page 201: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/201.jpg)
Computer ScienceScience
declarations can get a little … wordy
-unsigned long int size;
-void (*fn)(int);
-struct llnode *lst;
201
![Page 202: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/202.jpg)
Computer ScienceScience
typedef lets us create an alias for an existing type
202
![Page 203: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/203.jpg)
Computer ScienceScience
syntax:
typedef oldtype newtype;
- looks like a regular variable declaration to the right of typedef keyword
203
![Page 204: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/204.jpg)
Computer ScienceScience
/* declare `int_t` as an alias for `int` */typedef int int_t;
10, 10, 4, 4
main() { int i; int_t j; i = j = 10; printf("%d, %d, %lu, %lu", i, j, sizeof(int), sizeof(int_t));}
204
![Page 205: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/205.jpg)
Computer ScienceScience
/* declare `intp_t` as an alias for `int *` */typedef int *intp_t;
main() { int i; intp_t p; p = &i;}
205
![Page 206: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/206.jpg)
Computer ScienceScience
/* define both preceding aliases */typedef int int_t, *intp_t;
main() { int_t i; intp_t p; p = &i;}
206
![Page 207: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/207.jpg)
Computer ScienceScience
/* common integer aliases (see stdint.h) */
/* used to store "sizes" and "offsets" */typedef unsigned long int size_t;typedef long int off_t;
/* for small numbers; 8 bits only */typedef signed char int8_t;typedef unsigned char uint8_t;
/* for large numbers; 64 bits */typedef long int int64_t;typedef unsigned long int uint64_t;
207
![Page 208: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/208.jpg)
Computer ScienceScience
/* fn pointer typedef */typedef int (*handler_t)(int);
int kfn_menu(int duration) { /* ... */ }
main() { handler_t fp = kfn_menu; int ret = (*fp)(0); ...}
208
![Page 209: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/209.jpg)
Computer ScienceScience
/* linked-list type aliases */typedef struct llnode node, *nodep, *list;
struct llnode { void *val; struct llnode *next;};
main() { node n = { .val = NULL, .next = NULL }; list l = &n;}
209
![Page 210: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/210.jpg)
Computer ScienceScience
/* typedef from anonymous enum and structure */typedef enum { DIAMOND, CLUB, HEART, SPADE } suit_t;
typedef struct { int value; suit_t suit;} card_t, *hand_t;
main() { card_t carr[] = {{ .value = 10, .suit = DIAMOND }, { .value = 5, .suit = SPADE }, { .value = 12, .suit = HEART }, { .value = 8, .suit = DIAMOND }, { .value = 10, .suit = SPADE }}; hand_t hand = carr;}
210
![Page 211: C Primer - Illinois Institute of Technology · $ ./demo Hello world! $ int main {printf("Hello world!\n"); return 0;} 32. Computer Science Science Compilation Preprocessing Assembly](https://reader035.fdocuments.net/reader035/viewer/2022081405/5f06bb217e708231d4197373/html5/thumbnails/211.jpg)
Computer ScienceScience
</C_Primer>
211