]> Sergey Matveev's repositories - stargrave-blog.git/commit
Тип переменной индекса массива в Си
authorSergey Matveev <stargrave@stargrave.org>
Mon, 4 Jul 2022 11:41:07 +0000 (14:41 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Mon, 4 Jul 2022 12:21:50 +0000 (15:21 +0300)
commit5f1645eb510d76ffb07c07fa09bffdea01959c03
tree4b825dc642cb6eb9a060e54bf8d69288fbee4904
parentac262cc427a52b6c2fa9a10bb07dcc5dc6bb4038
Тип переменной индекса массива в Си

https://stackoverflow.com/questions/3174850/what-is-the-correct-type-for-array-indexes-in-c
https://sergvasiliev.medium.com/about-size-t-and-ptrdiff-t-a1654234d842
Вот размеры и длины я привык (и считаю корректным) указывать в size_t.
Но если хочется итерироваться по массиву, указывать элемент в нём, то
какой тип применять для переменной содержащей индекс? size_t плох тем,
что он беззнаковый, так что при логической ошибке или переполнении его
значение может стать огромным из-за переполнения и оно уйдёт в
бесконечный цикл например. Подобное отлаживать не очень приятно. А я уже
не раз напарывался на подобную ошибку.

Хочется использовать число со знаком. int может быть слишком маленьким.
ssize_t определён только в POSIX и гарантирует только [-1, SSIZE_MAX].
Куча людей указывается на ptrdiff_t. Но и он может, очевидно, быть
меньше size_t.

Посмотрел код всяких других проектов серьёзных, типа Redis. Они все
size_t используют. И пока я тоже остаюсь на нём, не забывая про косяки
неприятные во время разработки.