Essential storage keeps sign-in and learning features working. Google Analytics measures visits; Microsoft Clarity records interactions to help us improve usability. Both are optional and stay off until you choose. Read our privacy policy.
Store a fixed ordered collection, visit every valid index exactly once, and never assume an array knows its length.
Choose a representation, inspect sizes with sizeof, and convert values without pretending sizes are universal.
Distinguish defined, unspecified, implementation-defined, and undefined behavior, then debug with evidence.
Allocate, grow, and release runtime-sized storage while making ownership and failure paths explicit.
Represent a closed set of integral states with names, not unexplained literals.
Treat files as streams that can fail, check every open, and keep cleanup on every branch including errors.
Create, run, read, and repair a complete C source file with deliberate output and exit status.
Visit a counted range with for, keep the bound exclusive or inclusive on purpose, and prove the loop can stop.
Design focused functions with a declaration, a definition, parameters, return values, and a clear contract.
Choose a path with if, else if, and else, compare values clearly, and keep braces around every branch.
Format typed output, read values through addresses, and treat input as untrusted until conversion and range checks succeed.
Trace a C program from source file through compilation, linking, and terminal output.
Record which source creates which object, regenerate stale targets, and keep debug artifacts separate from release.
Calculate and compare values with operators whose types, order, and side effects you can explain.
Read and store memory addresses, mutate caller-owned objects, and keep every pointer's lifetime explicit.
Build multi-file C programs with preprocessing, headers, linkage, and explicit compile-and-link steps.
Connect functions, pointers, files, and dynamic memory in one tested terminal application.
Treat text as a character array that ends at \0, keep capacity visible, and never use gets().
Model related fields as one record, pass structures with clear ownership, and keep union members tagged.
Understand how a C name refers to a typed object, initialize before you read, and update values on purpose.