Я не нашел ничего в стандарте C11, заявив, что строка не может быть длиннее SIZE_MAX
(где SIZE_MAX
обозначает максимальное значение типа size_t
). Например. если size_max
- long
, а в моей реализации есть тип long long
, который строго больше long
, тогда я мог бы определить и индексировать такую строку, используя long long
.Может ли строка, соответствующая стандарту, длиннее символов SIZE_MAX?
Однако, это будет означать, некоторые необычные ситуации: strlen
, например, может быть не в состоянии вернуть фактический размер строки, так как результат будет преобразован в size_t
в конце концов, таким образом, строка длины SIZE_MAX+1
будет например, имеет размер 0. Это, например, нарушит стандарт и, таким образом, предотвратит существование таких строк? Для справки, 7.24.6.3 говорит только, что:
7.24.6.3 Функция StrLen
Синопсис
#include <string.h>
size_t strlen(const char *s);
Описание
Функция strlen вычисляет длину строки, на которую указывает s.
Возвращает
Функция StrLen возвращает количество символов, которые предшествуют завершающий нулевой символ.
Я что-то пропустил, или это было бы совершенно справедливо (данная стандартная реализация) C11?
"*, то я мог бы выделить [...] строка, используя длинный длинный. *", Предполагая, динамическое выделение, вы не можете, как 'таНос()' 'принимает size_t'. – alk
Проект C11 «рекомендует» в разделе 7.19/4: «* Типы, используемые для' size_t' и 'ptrdiff_t', не должны иметь целочисленный ранг преобразования больше, чем у' signed long int', если реализация не поддерживает объекты достаточно большой чтобы сделать это необходимым. * "Это косвенно говорит, что не было бы объекта больше, чем' SIZE_MAX'. – alk
@alk хорошо отмеченный, я имел в виду «объявить» вместо «выделить». Я исправил эту фразу. – anol