Я заплутався з величиною size_t в мові С. Знаю, що вона повертається оператором sizeof. Але що саме це таке? Тип даних?
Припустимо, у мене є цикл for:
for(i = 0; i < some_size; i++)
Чи потрібно використовувати int i;
чи ize_t i;
?
Згідно зі стандартом ISO C 1999 року (C99),
size_t
є цілим беззнаковим числом типу не менше 16 біт (див. розділи 7.17 та 7.18.3).
size_t
- це беззнаковий тип даних визначений декількома стандартами мови C/C++, наприклад, стандартом C99 ISO/IEC 9899, який визначений у файліstddef.h
.1 Він може бути бути додатково імпортований шляхом включенняstdlib.h
, оскільки цей файл внутрішньо підпорядкований включаєstddef.h
. Тип stddef.h Цей тип використовується для представлення розміру об'єкту. Бібліотечні функції що отримують або повертають розміри, очікують, що вони щоб вони були типу або мали тип повернення типу size_t. Далі, найбільш часто використовуваний компіляторний оператор sizeof повинен обчислювати константне значення константне значення, яке є сумісне з size_t`.
Як наслідок, size_t
є типом, що гарантовано вміщує будь-який індекс масиву.
size_t є беззнаковим типом. Отже, він не може представляти від'ємні значення (<0). Ви використовуєте його, коли рахуєте щось, і впевнені, що воно не може бути від'ємним. Наприклад, strlen()
повертає size_t
, тому що довжина рядка повинна бути не менше 0.
У вашому прикладі, якщо індекс циклу буде завжди більший за 0, можливо, є сенс використовувати size_t
, або будь-який інший беззнаковий тип даних.
При використанні об'єкту типу size_t потрібно переконатися, що у всіх контекстах його використання, включаючи арифметику, ви хочете отримати невід'ємні значення. Наприклад, припустимо, що у вас є
size_t s1 = strlen(str1);
size_t s2 = strlen(str2);
і ви хочете знайти різницю довжин str2
і str1
. Ви не можете цього зробити:
int diff = s2 - s1; /* bad */
Це пов'язано з тим, що значення, присвоєне функції diff
, завжди буде додатним числом, навіть коли 2 < s1
, тому що обчислення виконується з беззнаковими типами. У цьому випадку, залежно від того, яким є ваш варіант використання, можливо, краще використовувати int
(або long long
) для 1
та 2
.
У C/POSIX є деякі функції, які можуть/повинні використовувати size_t
, але не використовують його з історичних причин. Наприклад, другий параметр функції fgets
в ідеалі мав би бути size_t
, але він є int
.