Существует функция C, которая может помочь компилятору в диагностике этого, но я не знаю о компиляторе, который использует это и предупреждает. Если foo
было объявлено как void foo(uint8 par_var[static 2]);
, то вызывающая сторона должна передать указатель как минимум на два элемента, согласно C 2018 6.7.6.3 7:
Если ключевое слово static
также присутствует в [
и ]
деривации типа массива, то при каждом вызове функции значение соответствующего фактического аргумента должно обеспечивать доступ к первому элементу массив, содержащий как минимум столько же элементов, сколько указано в выражении размера.
Таким образом, компилятор, увидевший uint8 par_var; foo(&par_var);
, может распознать сбой передачи двух элементов и выдать предупреждение. (Хотя мне не известны компиляторы, которые проверяют объявленный размер, некоторые компиляторы будут предупреждать, когда для такого параметра передается нулевой указатель.)
Как известно, в объявлении void foo(uint8 par_var[2])
, par_var
автоматически устанавливается на uint8 *par_var
. В качестве альтернативы, вместо передачи указателя на uint8
, вы можете передать указатель на массив uint8
, объявив foo
как void foo(uint8 (*par_var)[2]);
.
Тогда вам нужно будет передать ему массив, например:
uint8 A[2];
foo(&A);
Если он был вызван с указателем на uint8
, компилятор должен выдать предупреждение. К сожалению, это также ограничивает рутину; Вы должны передать ему указатель на массив из двух uint8
и не можете передать ему указатель на массив большего размера или указатель на uint8
в массиве большего размера. Так что он имеет ограниченное использование. Тем не менее, он может служить в определенных ситуациях.