C
}
C виступає як класичною мовою системного програмування.== Pointer arithmetic ==
Стандартна бібліотека C
C дає можливість працювати з файлами через `FILE*`.
int sum_array(const int *items, int count) {
Приклад:
Помилка: вважати C простою мовою лише через невеликий синтаксис. Це означає, що вихідний код спочатку перетворюється компілятором на машинний код або об’єктні файли.
У C виступає як базові типи даних. return 0;
union
== Header files ==
</div>
</div>
== Static analysis ==Функція — це іменований блок коду, який здатна отримувати аргументи й повертати результат. Ritchie. count--;
Синтаксис
C дає багато контролю, але не захищає автоматизовано від багатьох помилок.</syntaxhighlight>
GCC
C і Linux
if (file == NULL) {
return a + b;
}
Практична роль: Makefile дає можливість не вводити довгі команди компіляції вручну щоразу. Приклад:
Приклад:
Стандарти C
Файл реалізації:
int result = add(2, 3);
- unit tests;
- integration tests;
- fuzz testing;
- static analysis;
- sanitizers;
- valgrind;
- code review;
- regression tests;
- boundary tests;
- failure tests. Висновок: C дає простий і прямий контроль, а Rust намагається зберегти продуктивність системного рівня з сильнішими гарантіями безпеки пам’яті.
Підходи:
return 0;
Динамічна пам’ять
- ручне керування пам’яттю;
- ризик buffer overflow;
- undefined behavior;
- відсутність автоматичної перевірки меж масивів;
- складність безпечної роботи з рядками;
- немає вбудованих високорівневих структур даних;
- складність великих codebase;
- небезпечні casts;
- помилки pointer arithmetic;
- відсутність вбудованих exceptions;
- багато відповідальності на програмісті.
</syntaxhighlight>
set(CMAKE_C_STANDARD 11)
C здатна бути не найкращим вибором для:
- змінні;
- типи даних;
- оператори;
- умови;
- цикли;
- функції;
- масиви;
- вказівники;
- структури;
- макроси;
- header files.
Перевага в embedded: C дає можливість писати ефективний код навіть для пристроїв із дуже обмеженою пам’яттю й процесором. int main(void) {
int id;
У цьому прикладі:
<syntaxhighlight lang="c">
CC = gcc
C дає можливість вручну виділяти й звільняти пам’ять. Приклади інструментів:
== Висновок ==
'''Практична користь:''' sanitizers допомагають оперативно знаходити memory bugs, які важко помітити вручну. return 0;
case 1:
Приклад:
return 0;
int add(int a, int b) {
* контроль пам’яті;
* контроль регістрів;
* мінімальний runtime;
* швидкість;
* передбачуваність;
* доступ до hardware;
* можливість писати firmware;
* підтримку cross-compilation. Критерій
== Buffer overflow ==
== Sanitizers ==
<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
<syntaxhighlight lang="c">
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
}
#endif
Рекомендовано:
Приклад:
clang -Wall -Wextra -std=c17 main.c -o app
</div>
#include "math_utils.h"
Поширені header files:
<syntaxhighlight lang="c">Масиви
Рядки
`p + 1` означає перехід до наступного елемента типу `int`, а не без зусиль збільшення адреси на 1 байт.=== Обчислення суми масиву ===
do {perror("fopen");
- вихід за межі масиву;
- розіменування NULL pointer;
- використання неініціалізованої змінної;
- signed integer overflow;
- use-after-free;
- порушення правил aliasing;
- неправильний формат у `printf`. Критично: C-код, який функціонує з мережею, файлами, користувацьким input або системними ресурсами, потребує особливо уважного security review.
gcc -Wall -Wextra -Wpedantic -std=c11 main.c -o app free(buffer); int main(void) {
критично: union потребує дисципліни, тому що програміст має знати, яке саме поле зараз виступає як активним. union Value { Головна перевага: C дає максимальний контроль і високу ефективність при відносно простій моделі мови. Основна ідея: C дає програмісту прямий контроль над пам’яттю й виконанням програми, тому її часто використовують там, де важливі швидкість, передбачуваність і близькість до апаратного рівня. Приклад:
'''критично:''' C створювалася як практична мова для реальних системних задач, тому в ній багато можливостей, які дають силу, але потребують дисципліни. Її дорожня карта розвитку пов’язаний із розробкою операційної системи Unix. Приклад:
'''Практична порада:''' у проєкті потрібно явно знати, під який стандарт C пишеться код: C89, C99, C11, C17 або C23. # Assembly. Вихід за межі здатна спричинити помилки, вразливості або аварійне завершення програми. char destination [16];
== Цикли ==
int age = 25;
printf("Hello, world!\n");
if (file == NULL) {
'''Критично:''' розіменування `NULL` pointer виступає як помилкою й здатна призвести до аварійного завершення програми.</div>
<syntaxhighlight lang="c">
$(CC) $(CFLAGS) -c main.c
char c;
== Структури ==
</div>
gcc -Wall -Wextra -std=c11 main.c -o app
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
Приклад:
Сценарії:
* індексація починається з 0;
* розмір часто потрібно контролювати вручну;
* вихід за межі масиву небезпечний;
* масиви тісно пов’язані з вказівниками. STATUS_ACTIVE,
<syntaxhighlight lang="c">
char name [8];
'''Preprocessor''' обробляє директиви перед компіляцією. Критерій
<syntaxhighlight lang="c"></syntaxhighlight>
app: main.o utils.o typedef struct {
<syntaxhighlight lang="c">
clean:
'''NULL pointer''' — це вказівник, який не вказує на дійсний об’єкт. * Документація Clang/LLVM.</div>
Класичний приклад програми на C:
'''malloc''' виділяє блок пам’яті. * Документація GCC. * Clang Static Analyzer;
* cppcheck;
* Coverity;
* PVS-Studio;
* GCC warnings;
* clang-tidy.</div>
};
void print_user(const User *user) {
if (buffer == NULL) {
'''Головне правило:''' безпечний C-код — це результат дисципліни, перевірок, тестів і явного керування ресурсами.<syntaxhighlight lang="c">
};
printf("%d\n", numbers [0]);
break;
printf("%s\n", name);
Clang відомий:int main(void) {
int numbers [] = {10, 20, 30};
} else {
- include <stdio.h>
}
</syntaxhighlight>
</syntaxhighlight>
- `#include <stdio.h>` підключає стандартну бібліотеку введення-виведення;
- `main` — головна функція програми;
- `printf` виводить текст;
- `return 0` означає успішне завершення програми. критично: C не потрібно використовувати всюди. Типовий бізнес-процес:
Практична роль: CMake часто використовують у більших C/C++ проєктах, де потрібна переносима платформа збірки. критично: синтаксис C здається простим, але багато складності приховано в роботі з пам’яттю, вказівниками й undefined behavior. Хороший C-код має бути:
return 1;
У C виступає як кілька типів циклів. На C або з сильним впливом C створювалися:
$(CC) $(CFLAGS) main.o utils.o -o app
printf("%d\n", *ptr);
Коли C здатна бути невдалим вибором
- швидкого web development;
- business applications;
- CRUD-систем;
- прототипів;
- enterprise UI;
- складної бізнес-логіки без потреби в низькому рівні;
- команд без досвіду memory safety;
- застосунків, де безпека важливіша за legacy-сумісність;
- сценаріїв, де Python, Java, Go, Rust або C# дають швидшу розробку. Практичний висновок: Python зручний для швидкої розробки, а C — для продуктивних низькорівневих частин, бібліотек і системних компонентів. # Отримання виконуваного файлу.
Clang — сучасний компілятор C, C++ і Objective-C, побудований на LLVM. Стандартна бібліотека C надає базові функції для:
double price = 19.99;
int add(int a, int b);
C має багато операторів.</syntaxhighlight>
Практична роль: C дає низькорівневі оператори, зокрема побітові операції, які важливі для системного й embedded програмування. Це сильний інструмент для конкретних задач, а не універсальна відповідь на всі проблеми. # Linking. Вона дає прямий контроль над пам’яттю, ефективність, переносимість і доступ до низькорівневих механізмів. Приклад корисних прапорців:
printf("Blocked\n");
Змінні
</syntaxhighlight>
int *ptr = NULL;
У цьому прикладі:
- include <stdio.h>
A l i c e \0 Суть умов: програма здатна змінювати поведінку залежно від значень змінних і результатів перевірок. }
union дає можливість зберігати різні типи даних в одній області пам’яті.Інструменти:
== Хороші практики C ==
== Обмеження C ==
<div style="background:#eef2ff; border-left:6px solid #4f46e5; padding:12px; margin:12px 0;">
Умовні оператори дозволяють виконувати різний код залежно від умови. Основні конкурентні переваги мови C:
'''Головне правило стилю:''' у C краще писати трохи більше явного коду, ніж приховувати складну поведінку в макросах і неочевидних pointer-трюках.</div> |
while (fgets(line, sizeof(line), file) != NULL) {
Системне програмування | |
|---|---|---|
| Виконання | Компіляція | Інтерпретація або bytecode/runtime |
| Швидкість | Дуже висока | Зазвичай нижча для CPU-bound коду |
| Рівень | Низькорівневий | Високорівневий |
| Пам’ять | Ручне керування | Автоматичне керування |
| Типові задачі | Системне ПЗ, embedded, бібліотеки | Скрипти, automation, data science, web, AI |
return a + b;
Небезпека: багато помилок у C не завжди проявляються одразу. * The C Programming Language, Brian W. Критично: C не перевіряє межі масиву автоматизовано. * buffer overflow;
- use-after-free;
- double free;
- memory leak;
- integer overflow;
- format string vulnerabilities;
- dangling pointers;
- uninitialized memory;
- race conditions;
- unsafe string functions.== історія продукту мови C ==
} Суть прикладу: кожна C-програма має точку входу, і зазвичай це функція `main`.== Функції == критично: знання C оптимізує краще розуміти Unix/Linux, системні виклики, пам’ять, процеси й низькорівневі API. Header files мають розширення `.h` і використовуються для оголошень. case 2:
User user = {1, "Alice"};
if (numbers == NULL) { </syntaxhighlight> main.o: main.c utils.h
</div>
</div>
for (int i = 0; i < 5; i++) {
printf("%d\n", i);
}</syntaxhighlight>
Undefined behavior
критично: робота з рядками в C потребує уважності, тому що потрібно враховувати розмір буфера і завершальний символ `\0`.
Структури використовуються для:
Порада: для типізованих констант краще використовувати `const`, а макроси залишати для випадків, де вони справді потрібні.
Fuzz testing
Практична роль: struct дає можливість створювати власні типи даних і групувати пов’язані поля. Python
Практична порада: C варто обирати тоді, коли контроль ресурсів важливіший за швидкість розробки й автоматичну безпеку.</syntaxhighlight>
enum
- висока продуктивність;
- контроль пам’яті;
- компактний runtime;
- близькість до hardware;
- переносимість;
- велика кількість компіляторів;
- зрілість екосистеми;
- використання в системному програмуванні;
- придатність для embedded;
- велика legacy-база;
- простий ABI;
- зручність для бібліотек і runtime-компонентів. }
! Rust
for (int i = 0; i < count; i++) {
sum += items [i];
}
return sum;
}
int main(void) {
int numbers [] = {1, 2, 3, 4, 5};
int result = sum_array(numbers, 5);
printf("Sum: %d\n", result);
return 0;
} </syntaxhighlight>
free(numbers);
Константи використовуються для значень, які не повинні змінюватися. Складність C полягає в пам’яті, ресурсах, undefined behavior і безпеці. int id;
}
'''Перевага:''' Clang часто зручний для розробки, тому що дає зрозумілі diagnostics і добре інтегрується з інструментами аналізу. Kernighan and Dennis M. !- неініціалізовані змінні;
- вихід за межі масиву;
- забутий `free`;
- double free;
- use-after-free;
- неправильний `sizeof`;
- неправильний формат у `printf`;
- розіменування `NULL`;
- плутанина між `=` і `==`;
- повернення pointer на локальну змінну;
- відсутність `break` у `switch`;
- неправильна робота з рядками;
- ігнорування warnings компілятора.
Основні групи: </div> int numbers [5] = {1, 2, 3, 4, 5}; <syntaxhighlight lang="bash">
</syntaxhighlight>
fclose(file);
Змінні в C мають:
C у embedded популярна, тому що дає:
printf("Unknown\n");
- crashes;
- buffer overflows;
- parsing bugs;
- memory errors;
- unexpected states;
- security vulnerabilities. char name [50];
break;
Критично: кожен успішний `malloc`, `calloc` або `realloc` має бути логічно завершений `free`, інакше виникає memory leak. * опису об’єктів;
- системних структур;
- записів;
- конфігурацій;
- даних протоколів;
- API-структур;
- binary formats. char name [] = "Alice";
Практична роль: у C помилки часто потрібно перевіряти явно після кожного ризикованого виклику. Приклад:
struct User user = {1, "Alice"};
int value = 10;
Перша програма на C
return 1;
- тип;
- ім’я;
- значення;
- область видимості;
- час життя;
- адресу в пам’яті.</syntaxhighlight>
- `<stdio.h>`;
- `<stdlib.h>`;
- `<string.h>`;
- `<math.h>`;
- `<ctype.h>`;
- `<time.h>`;
- `<stdint.h>`;
- `<stdbool.h>`;
- `<stddef.h>`.
'''Суть enum:''' enum робить код зрозумілішим, коли потрібно працювати з обмеженим набором станів. {| class="wikitable" return; <div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;"> '''Buffer overflow''' виникає, коли програма записує більше даних, ніж виділено в буфері. '''Практична роль:''' у C критично розуміти розмір типів, діапазон значень і поведінку при переповненні. Критерій Типові ризики: * `malloc`; * `calloc`; * `realloc`; * `free`. C має серйозні обмеження. * структурувати код; * повторно використовувати логіку; * тестувати частини програми; * зменшувати дублювання; * розділяти відповідальність. count = count + 1; <div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;"> }; == Типові помилки початківців == '''Практична роль:''' GCC часто застосовують, коли потрібно в Linux, embedded і open-source проєктах.== Умови == printf("Adult\n"); == Makefile == == конкурентні переваги C == * memory optimization; * binary protocols; * embedded; * parsers; * variant-like structures; * hardware registers. int add(int a, int b) { == Компіляція == `for`: == typedef == ! Програма здатна працювати під час тесту, але падати в production. * Документація CMake.== Константи == char name [8]; int main(void) { </div> printf("%d\n", *(p + 1)); * завжди перевіряти результат `malloc`; * звільняти пам’ять через `free`; * після `free` ставити pointer у `NULL`; * перевіряти межі масивів; * уникати небезпечних string functions; * використовувати `sizeof` правильно; * вмикати compiler warnings; * використовувати sanitizers; * писати tests; * уникати глобального mutable state; * документувати ownership; * мінімізувати макроси; * перевіряти return codes; * робити code review. # Preprocessing. * Документація cppcheck, Clang Static Analyzer, sanitizers і Valgrind.<div style="background:#eef2ff; border-left:6px solid #4f46e5; padding:12px; margin:12px 0;"> * низькорівневий контроль; * висока продуктивність; * embedded; * мінімальний runtime; * прямий доступ до hardware; * системне програмування; * бібліотеки для інших мов; * drivers; * kernels; * resource-constrained systems; * interoperability через C ABI. return 0; User user = {1, "Alice"}; utils.o: utils.c utils.h Приклад: $(CC) $(CFLAGS) -c utils.c } if (age >= 18) { <div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
char *buffer = malloc(256);
Embedded C
</syntaxhighlight>
clang -fsanitize=address -g main.c -o app Суть системного програмування: C дає можливість працювати близько до операційної системи, пам’яті, процесів і апаратного забезпечення. struct User {
C залишається важливою мовою для операційних систем, драйверів, embedded-систем, компіляторів, runtime-бібліотек і продуктивних компонентів. }
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
<syntaxhighlight lang="c">
const double PI = 3.1415926535;
Приклад:
* введення-виведення;
* роботи з рядками;
* роботи з пам’яттю;
* математичних обчислень;
* роботи з файлами;
* обробки символів;
* часу;
* сортування;
* перетворення типів. } while (condition);
* AddressSanitizer;
* UndefinedBehaviorSanitizer;
* ThreadSanitizer;
* MemorySanitizer;
* LeakSanitizer. У C написано багато системних компонентів, зокрема:
'''Підказка:''' у прикладах C критично звертати увагу не лише на результат, а й на перевірки, розміри буферів і ownership пам’яті. Приклад:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="c">
</div>
printf("%d\n", result);
}
C має компактний синтаксис, який вплинув на багато інших мов: C++, Java, JavaScript, C#, Go, Rust і багато інших.<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
Вона застосовується для для:
#ifndef CONFIG_H
#define CONFIG_H
#define MAX_SIZE 1024
#endif
'''Static analysis''' — це аналіз коду без запуску програми. '''критично:''' після відкриття файлу потрібно перевіряти помилки й закривати файл через `fclose`.== CMake ==
Основні елементи синтаксису:
'''typedef''' створює нове ім’я для існуючого типу.== C і C++ ==
buffer = NULL;
'''Makefile''' застосовується для для автоматизації збірки. '''Суть функції:''' функція перетворює вхідні інформаційні дані на результат або виконує певну дію.<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
#include <stdlib.h>
'''Головна думка:''' C — це мова контролю, продуктивності й системного рівня. '''Увага:''' макроси препроцесора не мають типів і можуть створювати складні для пошуку помилки. int main(void) {
Основні функції:
#include <stdio.h>
'''Мова програмування C''' — це фундаментальна компільована мова для системного, embedded і високопродуктивного програмування../app Практична роль: header files відокремлюють інтерфейс модуля від реалізації. int sum = 0;
- AFL++;
- libFuzzer;
- honggfuzz;
- OSS-Fuzz.
int *ptr = &value; </syntaxhighlight>
</syntaxhighlight>
так само у C часто використовуються макроси:
Приклад:
char grade = 'A'; ! * Документація GNU Make. Приклад:
Fuzz testing — це тестування випадковими, напіввипадковими або згенерованими input-даними. Критично: undefined behavior здатна працювати “нормально” під час тесту, а потім зламатися після оптимізації, зміни компілятора або запуску на іншій платформі. Водночас C потребує високої дисципліни: ручне керування пам’яттю, вказівники, undefined behavior і відсутність автоматичних перевірок можуть створювати серйозні помилки й security-ризики.== Clang ==
char name [50];
./main
<syntaxhighlight lang="c">
* `&value` отримує адресу змінної;
* `ptr` зберігає адресу;
* `*ptr` отримує значення за адресою. return 1;
Мова програмування C виступає як однією з найвпливовіших мов в історії програмування. '''enum''' дає можливість описувати набір іменованих констант.- функція повертає `NULL`;
- функція повертає `-1`;
- `errno` містить код помилки;
- `perror` друкує SEO-опис помилки;
- власні enum-коди статусів. Суть вказівника: pointer дає можливість працювати не лише зі значенням, а й з адресою, де це значення зберігається. Небезпека: buffer overflow здатна спричинити аварійне завершення програми, пошкодження пам’яті або security vulnerability. const char *source = "Hello";
Приклад:
</div>
int id;
C часто порівнюють із Rust, тому що обидві мови використовуються для системного програмування.</div>
char line [256];
Приклад:
Приклад `CMakeLists.txt`:
</div>
Union застосовується для в низькорівневих сценаріях:
<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
як приклад:
enum Status status = STATUS_ACTIVE;
|-
| Парадигма
| Процедурна, низькорівнева
| Multi-paradigm: procedural, object-oriented, generic
|-
| Абстракції
| Мінімальні
| Класи, шаблони, RAII, STL
|-
| Runtime
| Дуже компактний
| здатна бути складнішим
|-
| Використання
| Системи, embedded, kernels, libraries
| Застосунки, ігри, системи, high-performance software
|-
| Сумісність
| Близька історично
| Не виступає як без зусиль “C з класами” у сучасному вигляді
|}
'''Embedded C''' — це використання C для мікроконтролерів і вбудованих систем. Fuzzing оптимізує знаходити:
cmake_minimum_required(VERSION 3.16)
Мова C поєднує відносно простий синтаксис із дуже високим рівнем контролю над пам’яттю, процесором, структурами даних і системними ресурсами. '''GCC''' або '''GNU Compiler Collection''' — один із найвідоміших компіляторів C. Небезпечний приклад:
== Загальний SEO-опис ==
== Null pointer ==
}
== Безпека в C ==
== Вказівники ==
printf("%d %s\n", user.id, user.name);
project(MyApp C)
=== Безпечніше копіювання рядка ===
Інструменти можуть знаходити:
<syntaxhighlight lang="c">
#define MAX_USERS 100
Приклад:
</div>
CFLAGS = -Wall -Wextra -std=c11
Відомі версії:
Основні типи:
<syntaxhighlight lang="c">
printf("Run once\n");
* арифметичні: `+`, `-`, `*`, `/`, `%`;
* порівняння: `==`, `!=`, `<`, `>`, `<=`, `>=`;
* логічні: `&&`, `||`, `!`;
* побітові: `&`, `|`, `^`, `~`, `<<`, `>>`;
* присвоєння: `=`, `+=`, `-=`, `*=`;
* інкремент і декремент: `++`, `--`;
* адреса й розіменування: `&`, `*`.<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
float f;
'''Практична роль:''' цикли потрібні для повторення дій: обробки масивів, читання даних, обчислень і роботи з потоками.</div>
</div>
'''struct''' дає можливість об’єднати кілька полів у один тип.<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
`do while`:
Основні проблеми:- `#include`;
- `#define`;
- `#ifdef`;
- `#ifndef`;
- `#endif`;
- `#pragma`. printf("Active\n");
Приклади:
scanf("%s", name);
add_executable(myapp main.c utils.c) Практична порада: fuzz testing особливо корисний для C-коду, який парсить файли, мережеві пакети або зовнішній input. C
'''Змінна''' — це іменована область пам’яті для зберігання значення.</div>}
Перевага: C залишається важливою мовою, тому що дає можливість писати компактний, швидкий і близький до апаратного забезпечення код. # Compilation. Undefined behavior — це ситуація, коли стандарт C не визначає, що має статися. Приклад:
C і Python
Вказівник або pointer — це змінна, яка зберігає адресу іншої змінної в пам’яті.== malloc і free == так само виступає як `switch`:
Коли варто використовувати C
</syntaxhighlight>
* `char`;
* `short`;
* `int`;
* `long`;
* `long long`;
* `float`;
* `double`;
* `long double`;
* `_Bool`;
* `void`. enum Status {
</div>
== Preprocessor ==
'''free''' звільняє пам’ять. C
Приклад:
if (ptr != NULL) {
Поширені помилки:
int *numbers = malloc(5 * sizeof(int));
== Див. так само ==
}
while (count > 0) {
Приклад include guard:
int count = 10;
* potential null dereference;
* memory leaks;
* buffer overflows;
* uninitialized variables;
* unreachable code;
* suspicious casts;
* format string issues;
* undefined behavior risks. '''Масив''' — це послідовність елементів одного типу. * компіляції C-коду;
* системного програмування;
* Linux-розробки;
* embedded toolchains;
* оптимізації коду;
* створення об’єктних файлів;
* linking;
* cross-compilation. C
`while`:
} User;
<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">
!== Робота з помилками ==
{{SEO
|title=Мова програмування C — системне програмування, компіляція, пам’ять, вказівники, продуктивність і низькорівнева розробка
|description=Мова програмування C — Wiki-стаття про класичну компільовану мову програмування для системної розробки. Розглянуто історію C, синтаксис, компіляцію, GCC, Clang, змінні, типи даних, функції, вказівники, масиви, структури, пам’ять, malloc, free, header files, стандартну бібліотеку, безпеку, продуктивність, embedded, операційні системи, переваги, обмеження і хороші практики.
|keywords=мова програмування C, C programming language, C language, системне програмування, низькорівневе програмування, GCC, Clang, компілятор C, ANSI C, ISO C, C89, C99, C11, C17, C23, pointers, вказівники, memory management, malloc, free, struct, header files, стандартна бібліотека C, embedded C, операційні системи, Linux kernel, програмування
|alternativeTo=асемблер для частини системних задач; високорівневі мови там, де потрібен прямий контроль пам’яті; повільні інтерпретовані рішення для embedded; ручне написання машинного коду; складні runtime-платформи для низькорівневих систем; мови без прямого доступу до пам’яті
}}
Приклади директив:
<div style="background:#fef2f2; border-left:6px solid #ef4444; padding:12px; margin:12px 0;">
* ISO C standards. C — це компільована мова. C++
* простим;
* явним;
* добре структурованим;
* із перевіркою помилок;
* із зрозумілими іменами;
* із мінімумом глобальних змінних;
* із чітким ownership пам’яті;
* із документацією API;
* із тестами;
* із static analysis;
* із попередженнями компілятора. }
printf("%d\n", *ptr);
if (user == NULL) {
Приклад:
printf("User #%d: %s\n", user->id, user->name);
GCC застосовується для для:
* ядро Linux;
* системні утиліти;
* бібліотеки;
* драйвери;
* low-level daemons;
* частина інфраструктурного ПЗ. * операційні системи;
* ядра систем;
* компілятори;
* драйвери;
* embedded firmware;
* мережеві сервіси;
* бази даних;
* інтерпретатори мов;
* системні бібліотеки;
* графічні бібліотеки;
* високопродуктивні обчислювальні модулі.</div>
<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
У C рядок — це масив символів, який завершується нульовим символом `'\0'`. * достатньо високий рівень абстракції;
* доступ до пам’яті;
* можливість працювати з адресами;
* ефективний машинний код після компіляції;
* переносимість між різними платформами;
* компактний синтаксис. /* use buffer */
<syntaxhighlight lang="cmake">
У C можна виконувати арифметику вказівників. ! * Документація стандартної бібліотеки C. * CERT C Coding Standard.== Робота з файлами ==
* хорошими повідомленнями про помилки;
* швидкою компіляцією;
* підтримкою сучасних стандартів;
* інтеграцією з tooling;
* static analysis;
* форматуванням і перевірками коду;
* використанням у різних IDE. typedef struct {
switch (status) {
</div>
C стала практичною мовою для системного програмування, тому що давала:
'''Практична роль:''' static analysis оптимізує знаходити помилки до запуску програми й до потрапляння коду в production. Вона дуже потужна, але вимагає уважності, тестування, перевірки пам’яті й відповідального стилю програмування. snprintf(destination, sizeof(destination), "%s", source);
</div>
Приклад:
}
<syntaxhighlight lang="c">
</div>
== C і Rust ==
Мова C була розроблена на початку 1970-х років у Bell Labs. Приклади:
'''Увага:''' pointer arithmetic дуже потужна, але помилки в ній можуть пошкодити пам’ять або створити вразливості.<syntaxhighlight lang="c">
Приклад:
printf("%s", line);
C доцільно використовувати, коли потрібні:
{| class="wikitable"
|-
| Контроль пам’яті
| Ручний
| Контроль через ownership і borrow checker
|-
| Безпека
| Залежить від дисципліни програміста
| Більше перевірок на етапі компіляції
|-
| Простота мови
| Синтаксис відносно компактний
| Більше концепцій для вивчення
|-
| Legacy
| Дуже велика кодова база
| Молодша ERP-платформа
|-
| Використання
| Embedded, OS, libraries, drivers
| Systems, services, security-sensitive software
|}
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
</div>
rm -f *.o app
</div>
printf("Minor\n");
Після `free` не можна використовувати старий pointer як дійсний.<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
numbers = NULL;
#include <stdio.h>C-код потрібно тестувати, особливо якщо він функціонує з пам’яттю, файлами, мережею або hardware.
print_user(&user);
Поширені sanitizers:
FILE *file = fopen("data.txt", "r");
int *p = numbers;
FILE *file = fopen("missing.txt", "r");
</syntaxhighlight>
return 1;
int main(void) { } User; C має особливе значення для Linux-екосистеми. gcc main.c -o main
Висновок: C++ виріс із C, але сучасний C++ має іншу культуру, інструменти й підхід до безпеки ресурсів.== Оператори ==
- мікроконтролери;
- сенсори;
- побутова техніка;
- автомобільні системи;
- IoT;
- industrial controllers;
- medical devices;
- embedded Linux. це компільована мова програмування загального призначення, яка широко застосовується для; так само реалізовано embedded-розробки, операційних систем, драйверів, компіляторів, бібліотек, мережевого програмування, високопродуктивних застосунків і низькорівневої роботи з пам’яттю виступає ключовою рисою системного програмування забезпечується через C.</syntaxhighlight>
perror("fopen");
Приклад:
- include <stdio.h>
- include <string.h>
Джерела
</syntaxhighlight>
scanf("%7s", name);
</syntaxhighlight> Практична користь: typedef здатна зробити код коротшим і зручнішим для читання, особливо зі структурами.== Тематичні мітки == Особливості масивів у C:
Структура користувача
Приклади задач на C
== Стиль коду ==
/* math_utils.h */
'''CMake''' — популярна платформа генерації build-файлів для C і C++ проєктів. char name [50];
int i;
Рядок фактично виглядає так:
== Тестування C-коду ==
! numbers [0] = 10;
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
STATUS_BLOCKED
default:
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
printf("%s\n", destination);
Функції допомагають:
STATUS_NEW,
'''Sanitizers''' — це інструменти runtime-перевірки.<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">
<div style="background:#eef2ff; border-left:6px solid #4f46e5; padding:12px; margin:12px 0;">
return 0;
== Типи даних ==
}
* '''K&R C''' — рання форма мови, описана в книзі Kernighan і Ritchie;
* '''ANSI C''' або '''C89/C90''' — перший офіційний стандартизований варіант;
* '''C99''' — додав нові функції ERP, зокрема `//` коментарі, `long long`, `inline`;
* '''C11''' — додав покращення для багатопоточності, atomics та інші зміни;
* '''C17''' — коригувальний стандарт;
* '''C23''' — сучасніший стандарт із новими покращеннями. C часто використовує коди помилок. C і C++ пов’язані, але це різні мови. Безпечніше обмежити розмір:
}
<syntaxhighlight lang="c">
</div>
* операційних систем;
* драйверів;
* файлових систем;
* мережевих стеків;
* компіляторів;
* runtime libraries;
* системних утиліт;
* shell tools;
* low-level APIs;
* embedded firmware.</syntaxhighlight> Суть змінної: у C змінна — це не без зусиль ім’я, а конкретне місце в пам’яті з певним типом. /* math_utils.c */