由于 Misra C 的要求,我的一位同事想要使用指针声明,但我遇到了一些问题。 Misra(安全关键指南)不会让我们纯粹的程序员使用指针,但会让我们对数组字节进行操作。他打算获取一个指向字节数组的指针(因此我们不会在堆栈上传递实际的数组。)
// This is how I would normally do it
//
void Foo(uint8_t* pu8Buffer, uint16_t u16Len)
{
}
// This is how he has done it
//
void Foo(uint8_t (*pu8Buffer)[], uint16_t u16Len)
{
}
调用函数看起来像这样;
void Bar(void)
{
uint8_t u8Payload[1024]
uint16_t u16PayloadLen;
// ...some code to fill said array...
Foo(u8Payload, u16PayloadLen);
}
但是,当在 Foo() 中访问 pu8Buffer 时,数组是错误的。显然没有达到预期的效果。数组在调用函数中是正确的,但在 Foo() 内部不正确
我认为他创建了一个指向字节的指针数组,而不是指向字节数组的指针。
有人愿意澄清一下吗? Foo(&u8Payload, u16PayloadLen);也不行。
In void Foo(uint8_t (*pu8Buffer)[], uint16_t u16Len)
, pu8Buffer
是一个指向(不完整)数组的指针uint8_t
. pu8Buffer
类型不完整;它是一个指向大小未知的数组的指针。它不能用在需要大小的表达式中(例如指针算术;pu8Buffer+1
不允许)。
Then *pu8Buffer
是一个大小未知的数组。由于它是一个数组,因此在大多数情况下它会自动转换为指向其第一个元素的指针。因此,*pu8Buffer
成为指向第一个的指针uint8_t
数组的。转换后的类型*pu8Buffer
做完了;它是一个指向uint8_t
,因此可以用于地址运算;*(*pu8Buffer + 1)
, (*pu8Buffer)[1]
, and 1[*pu8Buffer]
都是有效的表达式uint8_t
超越一*pu8Buffer
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)