【问题标题】:Warnings when passing a fixed size array to a function as a pointer将固定大小的数组作为指针传递给函数时的警告
【发布时间】:2019-05-20 08:56:24
【问题描述】:

我有一个包含字节的固定大小的数组(总是相同的大小)。代码如下:

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);: INFO: 预期 'uint8_t*{aka unsigned char }' 但参数的类型为 'uint8_t()[4]{aka unsigned 字符 (*)[4]}'

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

在其他一些帖子中挖掘了一下,我发现也许解决方案是将其声明为(*arr)[4],这可能是有道理的,但应用它们会使代码工作不同。我很确定我对这个指针声明和参数传递感到一团糟,所以如果有人能帮助我澄清这些概念,我将不胜感激。

【问题讨论】:

  • 不要传递数组的地址,当传递给函数时,数组已经(衰减成)指针:foo(&amp;arr); --> foo(arr);
  • &amp;arr 是指向数组本身的指针,它的类型为uint8_t (*)[4]。你想传递一个指向第一个元素的指针,即&amp;arr[0],或者简单的arr,因为它会衰减到指向第一个元素的指针。该指针将具有uint8_t * 的预期类型。
  • 谢谢@KeineLust 和@some-programmer-dude,修复了警告。无论如何,这意味着将数组按原样传递给函数将始终将其作为指针传递?所以修改它也会在main中修改它......
  • @user11527039 是的!
  • 您当前的函数已经正在修改数组的内容。还是你的意思是别的?

标签: c arrays pointers


【解决方案1】:

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

数组衰减为指针:

int arr[10];

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 2017-04-23
    • 1970-01-01
    • 2012-01-24
    相关资源
    最近更新 更多