将固定大小的数组作为指针传递给函数时的警告

时间:2019-05-20 08:56:24

标签: c arrays pointers

我有一个包含字节的固定大小的数组(大小将始终相同)。这是代码:

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
    }
}

这个想法是在main上有一个固定大小的数组作为缓冲区,并在每次调用foo时修改其内容。它可以正常工作,但是它给出了一些警告和信息,使我认为某些内容未正确说明。

  

static void foo(uint8_t *arr_ptr);:信息:预期的'uint8_t * {aka   unsigned char }”,但参数的类型为“ uint8_t()[4] {aka unsigned   char(*)[4]}'

     

foo(&arr):警告:从不兼容的指针类型传递'foo'的参数1

深入研究其他一些文章,我发现也许一个解决方案是将其声明为(*arr)[4],这也许是有道理的,但是应用它们会使代码的工作方式有所不同。我很确定我对这个指针声明和参数传递感到困惑,因此,如果有人可以帮助我阐明这些概念,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

警告是因为传递的指针具有另一种类型。

数组衰减到指针:

int arr[10];

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

两个指针都引用内存中的同一对象,但是具有不同的类型-因此发出警告。