Конечно st должен быть размером 20 (или больше).
Вы можете использовать функцию индексов массива stati c в C99, доступную для использования в деклараторы функций .
Если ключевое слово stati c также появляется внутри [и] производного типа массива, то для каждого вызова функции значение соответствующего фактического Аргумент должен обеспечивать доступ к первому элементу массива, содержащему как минимум столько элементов, сколько указано в выражении размера.
Итак, вы можете объявить функцию как
void myFunction(char string[static 20])
{
/* ... */
}
вместо. Это вызовет предупреждение от компилятора, если переданный аргумент массива содержит менее 20 элементов.
Например, при вызове myFunction
с st
типа char [5]
, clang 10 дает мне warning: array argument is too small; contains 5 elements, callee requires at least 20 [-Warray-bounds]
Однако на данный момент только clang, похоже, поддерживает -Warray-bounds
, а G CC планирует добавить поддержку в будущем .
Обратите внимание, что это работает только во время компиляции для массивов, но также предупреждает при передаче указателей NULL (если это можно определить во время компиляции). Однако кто-то может передать указатель на динамически выделяемый массив элементов менее 20, и компилятор не может статически проверить это во время компиляции.
Таким образом, в этом случае он работает хорошо только тогда, когда объявленный тип аргумент - char [N]
, где N - его размер, а N - по крайней мере 20. Если вы используете sh для обработки обоих случаев, потребуется явный параметр размера и проверка внутри функции, чтобы вернуть ошибку в случае, если переданный размером меньше 20.