C is a general-purpose, structured programming language, statically typed, and a compiled language. It is used to implement some of the most important software, including important parts of operating systems (Windows, Linux), Git, etc.
The competency area includes an understanding of the C preprocessor, memory layout, working with Structures and Unions, ability to accept and pass command-line arguments in a program, understanding of the process of compiling a C program, among others.
- Understanding C Preprocessor - Awareness of commonly used directives (ifdef, undef, define, include, pragma) and defining macros with a define directive. Ability to define simple macros, such as writing a macro to swap two variables or finding the square of a number.
- Memory Layout - Understanding the memory layout, which contains 5 main components: Stack, Heap, Data Segment (uninitialized and initialized), and Code Segment. Ability to use each of the components.
- Working with Structures and Unions - Ability to write programs with the use of struct and union.
- Command Line arguments - Ability to accept command-line arguments in a program and also, passing them.
- Dynamic Memory allocation (DMA) - Understanding of Dynamic Memory Allocation, which is a way for a programmer to allocate memory to resources manually during runtime. This memory is allocated on the Heap. C supports DMA by providing malloc(), ralloc(), and calloc().
- C Compilation - Understanding of the process of compiling a C program from its source code to object code.
- Multithreading (pthread) - Ability to write programs using multithreading for tasks, such as counting the number of each word in a given file.
- Advanced programs - Ability to write advanced programs such as implementing data structures (such as linked lists, binary trees, heap, etc), etc.