c - 将固定大小的数组作为指针传递给函数时的警告
问题描述
我有一个包含字节的固定大小的数组(它将始终具有相同的大小)。这是代码:
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 char (*)[4]}'在
foo(&arr)
:警告:从不兼容的指针类型传递“foo”的参数 1
在其他一些帖子中挖掘了一下,我发现解决方案可能是将其声明为(*arr)[4]
,这可能是有道理的,但应用它们会使代码工作不同。我很确定我对这个指针声明和参数传递感到一团糟,所以如果有人能帮助我澄清这些概念,我将不胜感激。
解决方案
警告是因为传递的指针具有另一种类型。
数组衰减为指针:
int arr[10];
foo(arr); /* <- array decals to the pointer to int. */
foo(&arr); /* <- array decals to the pointer to array of 10 ints. */
两个指针都引用内存中的同一个对象,但具有不同的类型——因此会出现警告。
推荐阅读
- javascript - 如果使用 map() 渲染,如何从子组件更改父组件的状态
- reactjs - react-google-maps 可以使用图像地图类型吗?
- jsf - CDI bean 在 glassfish 5 build 25 中导致 javax.el.PropertyNotFoundException
- python - 矩阵a为二维矩阵,b为三维矩阵时,matmul函数如何理解?
- python - 如何检查数据框是否包含python中的字符串?
- haskell - 为什么'head'(来自前奏包)没有用Maybe以安全的方式实现?
- angular - 如何修复角度 6 中的静态喷射器错误?
- scheme - 当条件为假时,`when` 返回什么?
- c# - Xamarin HybridWebView 导航到缓存文件夹中的页面
- java - setValue 后的不同值