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

3

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

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*{aka unsigned char }”,但参数的类型是“uint8_t()[4]{aka unsigned char (*)[4]}”
在“foo(&arr)”处:WARNING: 从不兼容的指针类型传递参数 1
通过查阅其他帖子,我发现也许解决方法是将其声明为“(*arr)[4]”,这也许有意义,但实际应用时代码的工作方式不同。我相当确定我的思维混乱了,对于这些指针声明和参数传递的概念,如果有人能帮助我澄清,我会很感激。

10
不要传递数组的地址,当数组作为参数传递给函数时,它已经自动转换成指针了:foo(&arr); --> foo(arr); - David Ranieri
3
&arr是指向数组本身的指针,它的类型是uint8_t (*)[4]。你想要传递一个指向第一个元素的指针,也就是&arr[0],或者直接使用arr,因为它会转化为指向第一个元素的指针。该指针将具有预期的类型uint8_t * - Some programmer dude
谢谢@KeineLust和@some-programmer-dude,这解决了警告问题。那么,这意味着将数组直接传递给函数将始终作为指针传递?因此,修改它也会在主函数中修改它... - EUS
@user11527039 是的! - David Ranieri
你当前的函数已经在修改数组的内容。或者你是指其他的意思? - Some programmer dude
1个回答

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. */

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接