#+TITLE: Learn Memory Management in C #+AUTHOR: Riyyi #+LANGUAGE: en #+OPTIONS: toc:nil Completed course from [[https://www.boot.dev/courses/learn-memory-management-c][boot.dev]]. The exercises from the course have been worked out in this repo. This is my way of having the "certificate" for free. If you're reading this with the intention of completing the exercises yourself, just remove the directories from the =src= directory and recreate the directory with the files from the exercise. Alternatively, just remove the file the exercise is asking you to modify as you go. Note: - In chapter 6 exercise 6, macOS malloc will almost never return a NULL pointer due to virtual memory overcommit, so you should check for ~size == 1024 * 1024 * 100)~ instead of ~array == NULL~ - In chapter 8, I renamed ~stack_t~ to ~my_stack_t~ due to a =std= naming conflict on macOS The first the 3 chapters of the course can be done interactively on the website. [[./bootdev-c.png]] ** Build instructions Compiling and running all the tests can be done with the following commands: #+BEGIN_SRC sh $ mkdir build $ cd build $ cmake .. $ make run #+END_SRC ** Output Successful output of all the tests: #+BEGIN_SRC sh $ make run 12:25PM [ 3%] Built target munit [ 8%] Built target 8-6-multiple-types [ 11%] Built target 4-1-enums [ 14%] Built target 4-2-non-default-values [ 17%] Built target 4-3-switch-case [ 20%] Built target 4-4-sizeof-enum [ 24%] Built target 5-1-union [ 26%] Built target 5-2-memory-layout [ 29%] Built target 5-3-5-4-union-size [ 32%] Built target 5-5-helper-fields [ 34%] Built target 6-1-the-stack [ 37%] Built target 6-2-why-a-stack [ 39%] Built target 6-3-stack-overflow [ 42%] Built target 6-4-pointers-to-the-stack [ 46%] Built target 6-5-the-heap [ 50%] Built target 6-6-malloc [ 53%] Built target 6-7-free [ 56%] Built target 6-8-big-endian-little-endian [ 60%] Built target 7-1-pointer-pointers [ 64%] Built target 7-2-array-of-pointers [ 67%] Built target 7-3-void-pointers [ 71%] Built target 7-4-swapping-integers [ 75%] Built target 7-5-swapping-strings [ 79%] Built target 7-6-generic-swap [ 83%] Built target 8-1-low-level-stack [ 87%] Built target 8-2-stack-push [ 91%] Built target 8-3-stack-pop [ 94%] Built target 8-4-stack-free [100%] Built target 8-5-dangerous-push Running test suite with seed 0x039ca6b1... colors/are_defined [ OK ] [ 0.00000100 / 0.00000200 CPU ] colors/are_defined_correctly [ OK ] [ 0.00000100 / 0.00000100 CPU ] 2 of 2 (100%) tests successful, 0 (0%) test skipped. Running test suite with seed 0xbf68f4fa... colors/defined [ OK ] [ 0.00000100 / 0.00000100 CPU ] colors/defined_vscode [ OK ] [ 0.00000100 / 0.00000000 CPU ] 2 of 2 (100%) tests successful, 0 (0%) test skipped. Running test suite with seed 0x40b17fef... http/switch_enum [ OK ] [ 0.00000100 / 0.00000200 CPU ] http/switch_enum_default [ OK ] [ 0.00000100 / 0.00000000 CPU ] 2 of 2 (100%) tests successful, 0 (0%) test skipped. The size of BigNumbers is 8 bytes The size of HttpErrorCode is 4 bytes Running test suite with seed 0xde548fa9... format/integer [ OK ] [ 0.00000200 / 0.00000200 CPU ] format/string [ OK ] [ 0.00000100 / 0.00000100 CPU ] format/integer_nvim [ OK ] [ 0.00000100 / 0.00000200 CPU ] format/string_nvim [ OK ] [ 0.00000200 / 0.00000200 CPU ] 4 of 4 (100%) tests successful, 0 (0%) test skipped. value (set): -420 err (unset): 4294966876 value (unset): -1 err (set): 4294967295 Running test suite with seed 0xa7197940... PacketHeader/test_packet_header_size [ OK ] [ 0.00000100 / 0.00000200 CPU ] PacketHeader/test_tcp_header_fields [ OK ] [ 0.00000100 / 0.00000100 CPU ] PacketHeader/test_field_raw_size [ OK ] [ 0.00000000 / 0.00000100 CPU ] PacketHeader/test_field_to_raw_consistency[ OK ] [ 0.00000100 / 0.00000100 CPU ] 4 of 4 (100%) tests successful, 0 (0%) test skipped. --------------------------------- Stack pointer offset: 0 bytes --------------------------------- Dark mode? --------------------------------- Stack pointer offset: 0 bytes --------------------------------- More like... --------------------------------- Stack pointer offset: 0 bytes --------------------------------- dark roast. Running test suite with seed 0x7dcfad3b... /example/compare [ OK ] [ 0.00000100 / 0.00000000 CPU ] /example/rand [ OK ] [ 0.00000100 / 0.00000000 CPU ] /example/parameters foo=one, bar=red [ OK ] [ 0.00000200 / 0.00000200 CPU ] foo=one, bar=green [ OK ] [ 0.00000200 / 0.00000300 CPU ] foo=one, bar=blue [ OK ] [ 0.00000200 / 0.00000200 CPU ] foo=two, bar=red [ OK ] [ 0.00000100 / 0.00000200 CPU ] foo=two, bar=green [ OK ] [ 0.00000200 / 0.00000200 CPU ] foo=two, bar=blue [ OK ] [ 0.00000200 / 0.00000200 CPU ] foo=three, bar=red [ OK ] [ 0.00000100 / 0.00000200 CPU ] foo=three, bar=green [ OK ] [ 0.00000200 / 0.00000100 CPU ] foo=three, bar=blue [ OK ] [ 0.00000100 / 0.00000200 CPU ] 11 of 11 (100%) tests successful, 0 (0%) test skipped. Size of pool: 10240 Initial string: snek c1: 10, 20 c2: 30, 40 c3: 50, 60 Running test suite with seed 0x53c7e720... get_full_greeting/test_basic_greeting[ OK ] [ 0.00000200 / 0.00000300 CPU ] get_full_greeting/test_short_buffer [ OK ] [ 0.00000200 / 0.00000200 CPU ] 2 of 2 (100%) tests successful, 0 (0%) test skipped. Running test suite with seed 0xee42ee28... allocate_scalar_array/test_allocate_scalar_array_size[ OK ] [ 0.00000100 / 0.00000200 CPU ] allocate_scalar_array/test_allocate_scalar_array_values[ OK ] [ 0.00000200 / 0.00000100 CPU ] allocate_scalar_array/test_allocate_scalar_array_zero_multiplier[ OK ] [ 0.00000200 / 0.00000100 CPU ] allocate_scalar_array/test_allocate_too_much[ OK ] [ 0.00001000 / 0.00000900 CPU ] 4 of 4 (100%) tests successful, 0 (0%) test skipped. Allocated 500 lists Running test suite with seed 0x9d78388e... /example/compare [ OK ] [ 0.00000100 / 0.00000200 CPU ] /example/rand [ OK ] [ 0.00000100 / 0.00000200 CPU ] /example/parameters foo=one, bar=red [ OK ] [ 0.00000200 / 0.00000200 CPU ] foo=one, bar=green [ OK ] [ 0.00000100 / 0.00000200 CPU ] foo=one, bar=blue [ OK ] [ 0.00000200 / 0.00000100 CPU ] foo=two, bar=red [ OK ] [ 0.00000200 / 0.00000200 CPU ] foo=two, bar=green [ OK ] [ 0.00000200 / 0.00000000 CPU ] foo=two, bar=blue [ OK ] [ 0.00000200 / 0.00000100 CPU ] foo=three, bar=red [ OK ] [ 0.00000100 / 0.00000100 CPU ] foo=three, bar=green [ OK ] [ 0.00000200 / 0.00000200 CPU ] foo=three, bar=blue [ OK ] [ 0.00000200 / 0.00000200 CPU ] 11 of 11 (100%) tests successful, 0 (0%) test skipped. Running test suite with seed 0x07fdd526... allocate_list/create [ OK ] [ 0.00000100 / 0.00000000 CPU ] allocate_list/overwrite [ OK ] [ 0.00000100 / 0.00000100 CPU ] 2 of 2 (100%) tests successful, 0 (0%) test skipped. Running test suite with seed 0xf26a30e1... create_token_pointer_array/test_create_token_pointer_array_single[ OK ] [ 0.00000200 / 0.00000200 CPU ] create_token_pointer_array/test_create_token_pointer_array_multiple[ OK ] [ 0.00000300 / 0.00000200 CPU ] create_token_pointer_array/test_create_token_pointer_array_memory_allocation[ OK ] [ 0.00000200 / 0.00000300 CPU ] 3 of 3 (100%) tests successful, 0 (0%) test skipped. Running test suite with seed 0x4c18af41... snek_zero_out/test_zero_out_integer [ OK ] [ 0.00000100 / 0.00000100 CPU ] snek_zero_out/test_zero_out_float [ OK ] [ 0.00000100 / 0.00000200 CPU ] snek_zero_out/test_zero_out_bool [ OK ] [ 0.00000100 / 0.00000000 CPU ] snek_zero_out/test_zero_out_nonzero_values[ OK ] [ 0.00000100 / 0.00000200 CPU ] 4 of 4 (100%) tests successful, 0 (0%) test skipped. Running test suite with seed 0xb0750720... void-pointer/swap_ints [ OK ] [ 0.00000100 / 0.00000100 CPU ] void-pointer/swap_ints_same [ OK ] [ 0.00000100 / 0.00000100 CPU ] 2 of 2 (100%) tests successful, 0 (0%) test skipped. Running test suite with seed 0xc10a0ca0... void-pointer/swap_str [ OK ] [ 0.00000100 / 0.00000100 CPU ] void-pointer/test_swap_str_long [ OK ] [ 0.00000100 / 0.00000100 CPU ] 2 of 2 (100%) tests successful, 0 (0%) test skipped. Running test suite with seed 0xa27e09af... swap/generic_ints [ OK ] [ 0.00000200 / 0.00000200 CPU ] swap/generic_strings [ OK ] [ 0.00000200 / 0.00000100 CPU ] swap/generic_struct [ OK ] [ 0.00000200 / 0.00000200 CPU ] 3 of 3 (100%) tests successful, 0 (0%) test skipped. Running test suite with seed 0xd1be93bf... snekstack/create_stack_small [ OK ] [ 0.00000100 / 0.00000000 CPU ] snekstack/create_stack_large [ OK ] [ 0.00000100 / 0.00000200 CPU ] 2 of 2 (100%) tests successful, 0 (0%) test skipped. Running test suite with seed 0x92735306... snekstack/create_stack [ OK ] [ 0.00000200 / 0.00000100 CPU ] snekstack/push_stack [ OK ] [ 0.00000100 / 0.00000200 CPU ] snekstack/push_double_capacity [ OK ] [ 0.00000200 / 0.00000200 CPU ] 3 of 3 (100%) tests successful, 0 (0%) test skipped. Running test suite with seed 0xd641eade... snekstack/create_stack [ OK ] [ 0.00000200 / 0.00000200 CPU ] snekstack/push_stack [ OK ] [ 0.00000200 / 0.00000200 CPU ] snekstack/pop_stack [ OK ] [ 0.00000200 / 0.00000100 CPU ] snekstack/pop_stack_empty [ OK ] [ 0.00000200 / 0.00000100 CPU ] 4 of 4 (100%) tests successful, 0 (0%) test skipped. Running test suite with seed 0xd1d1136d... snekstack/create_stack [ OK ] [ 0.00000200 / 0.00000100 CPU ] snekstack/push_stack [ OK ] [ 0.00000200 / 0.00000200 CPU ] snekstack/pop_stack [ OK ] [ 0.00000200 / 0.00000200 CPU ] 3 of 3 (100%) tests successful, 0 (0%) test skipped. Running test suite with seed 0x5493a18d... snekstack/heterogenous_stack [ OK ] [ 0.00000100 / 0.00000200 CPU ] 1 of 1 (100%) tests successful, 0 (0%) test skipped. Running test suite with seed 0x0dc3c3f9... snekstack/multiple_types_stack [ OK ] [ 0.00000300 / 0.00000200 CPU ] 1 of 1 (100%) tests successful, 0 (0%) test skipped. [100%] Built target run #+END_SRC