Предупреждения при передаче массива фиксированного размера в функцию в качестве указателя - PullRequest
3 голосов
/ 20 мая 2019

У меня есть массив фиксированного размера (который всегда будет одного размера), содержащий байты.Вот код:

static void foo(uint8_t *arr_ptr);

void main()
{
    uint8_t arr[4];
    foo(&arr);
}

static void foo(uint8_t *arr_ptr)
{
    for(uint8_t i=0; i<4; i++)
    {
        arr_ptr[i]=1; // Set to one just to make it simpler
    }
}

Идея состоит в том, чтобы иметь массив фиксированного размера в качестве буфера и изменять его содержимое каждый раз, когда вызывается foo.Он работает так, как должен, но выдает некоторые предупреждения и информацию, из-за которой я думаю, что что-то указано неправильно.

При static void foo(uint8_t *arr_ptr);: INFO: Ожидается} 'но аргумент имеет тип' uint8_t () [4] {aka unsigned char (*) [4]} '

В foo(&arr): ПРЕДУПРЕЖДЕНИЕ: передача аргумента 1 из' foo 'изнесовместимый тип указателя

Копая немного в некоторых других сообщениях, я видел, что, возможно, может быть решение объявить его как (*arr)[4], что может иметь смысл, но применение их заставляет код работатьразные.Я почти уверен, что запутался в этом объявлении указателя и передаче аргумента, поэтому я был бы признателен, если бы кто-то мог помочь мне прояснить эти понятия.

1 Ответ

2 голосов
/ 20 мая 2019

Предупреждение связано с тем, что переданный указатель имеет другой тип.

Массив распадается на указатели:

int arr[10];

foo(arr); /* <- array decals to the pointer to int. */
foo(&arr); /* <- array decals to the pointer to array of 10 ints. */

Оба указателя ссылаются на один и тот же объект в памяти, но имеют разные типы - следовательно,предупреждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...