Help

Exercises

Reference

Examples

To get the examples on your own computer, right-click and save to download them.

To get the examples on thoth:

thoth will download the file from this site directly.

Safari users: Safari sometimes changes file extensions. Do not trust it.

Intro and C Basics
1_hello_world.c Welcome to C!
1_cant_add_strings.c You're not in Java-land anymore.
Animation of 1_cant_add_strings Step through with "Next >". Watch str = str + x especially.
1_variable_weirdness.c "Fun" things can happen when you don't initialize variables.
1_printf.c Printing things out with C's version of System.out.println.
1_fgets.c Getting input with fgets... kinda.
Functions
2_get_line_fail.c Coming up with the signature for a function that takes an array parameter.
2_get_line_success.c The proper way to write the get_line function.
2_get_line_prototype.c Using a function prototype to access a function before it's defined.
2_return_array_fail.c Returning local arrays is a bad idea.
Pointers
3_sizeof.c sizeof() might not work how you expect.
3_pointers.c Shows the address-of &x and value-at *p operators to create and access pointers.
3_arrays_are_pointers.c Yep. Shows array address calculation.
3_array_of_strings.c Double-pointers are usually used for arrays-of-arrays. Like arrays of strings!
3_2d_arrays.c 2D arrays and arrays-of-arrays are actually different things!
6_const_ptrs.c The const keyword is a neat addition to pointers.
6_ptr_casts.c Pointer casting lets you "reinterpret" the meaning of bit patterns.
Animation of 6_ptr_casts (Click "Visualize Execution") You can step through it line-by-line and see what's happening.
6_ars.c Shows addresses of local variables inside ARs as functions are called.
Strings
4_strings_are_bad.c Strings in C are bad, okay?
4_cant_modify_literals.c String literals are different beasts.
4_str_size_length.c strlen() and sizeof() are very different things.
proj4_tokenization.c How to properly tokenize a string for the shell project.
Files
4_read_write_text_file.c Reading/writing text files is pretty straightforward.
5_binary_file.c Reading/writing binary files is also pretty straightforward.
The heap (malloc/free)
Linked list (Click "Visualize Execution") Very basic linked list on the heap.
7_memory_leak.c Use valgrind to see the memory this program leaks.
Use-after-free (Click "Visualize Execution") after freeing heap memory, it's invalid.
Structs, Enums, Typedefs
5_food_struct.c How to define and use a simple struct.
5_linked_list.c Making self-referential struct pointers.
5_enum_color.c Common patterns for using enums.
Misc
5_cmd_args.c Command-line arguments, like you'll need for proj1!
10_a_terrible_function.java Here's exactly how NOT to write a function. Thanks, MARS.
10_a_better_function.java Pseudocode improvement of the previous function.
10_whats_wrong.c A program that crashes. Use the debugger to figure out why!
15_asm_test.c Stuff to look at in gdb.
Multi-file compilation and make
compile.sh A very simple compilation script. You'll have to chmod +x it to use it.
Makefile The makefile for the following example. IMPORTANT: make sure its name is Makefile exactly.
11_main.c The main file.
11_user.c The second file.
11_user.h The header file for 11_user.c.
Function Pointers
13_qsort.c Using qsort.
13_qsort_structs.c Another qsort example, but sorting structs this time.
ArraySorting.java That same example, done with equivalent Java features.
13_method.c Function pointers make Java-style method calls work.
Linking and Loading
12_main_island.c Goes with the next file.
12_sub_island.c Goes with the previous file.
13_innocent.c Goes with the next file.
13_bad.c Goes with the previous file.
Processes
14_pmap.c Prints its own (virtual) memory map.
14_mmap.c Uses mmap() to allocate some memory and to "load" a file.
17_fork.c Demonstrates the fork() POSIX API function.
17_exec.c Demonstrates the execvp() POSIX API function.
17_waitpid.c Seeing how a child process terminated.
17_signal.c Setting up a signal handler for... nefarious purposes...
Threads
21_thread_test.c Makes 5 threads. But without joining, they do weird stuff...
ThreadTest.java The above example implemented in Java. No weirdness if you don't join.
21_thread_switching.c Shows how 2 threads alternate in time, but in an arbitrary way.
22_strtok.c Multiple threads + one global variable = sadness.
22_strtok_r.c Multiple threads + reentrant strtok = happiness.
22_thread_racing.c A classic race condition where 2 threads try to change 1 variable.
ThreadRacing.java The above example implemented in Java. Same problem.
22_thread_cooperating.c The fixed version of the previous example.
ThreadCooperating.java The above example implemented in Java. Shows synchronized.
22_bad_critsec.c Another version of the previous, but with a worse design.
23_spinwait.c If one thread has to wait for another, "spin-waiting" is not the best way.
23_condvar.c Condition variables are a better way for threads to say "hey, wake up!"
23_barrier.c A producer-consumer example using condition variables.
23_prodcons.c A producer-consumer example using condition variables.