2

Misra C の要件のために、同僚の 1 人が使用したいポインター宣言で問題が発生しています。Misra (Safety Critical ガイドライン) では、単なるプログラマーがポインターを使用することはできませんが、配列バイトを操作できるようになります。彼は、バイト配列へのポインターを取得するつもりです (そのため、実際の配列をスタックに渡しません)。

// 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); どちらも機能しません。

4

2 に答える 2

4

ではvoid Foo(uint8_t (*pu8Buffer)[], uint16_t u16Len)pu8Bufferの (不完全な) 配列へのポインタですuint8_tpu8Buffer不完全型です。サイズが不明な配列へのポインタです。サイズが必要な式では使用できません (ポインター演算などは使用できpu8Buffer+1ません)。

次に*pu8Buffer、サイズが不明な配列です。これは配列であるため、ほとんどの場合、最初の要素へのポインターに自動的に変換されます。したがって、配列*pu8Bufferの最初へのポインターになります。uint8_t変換された型*pu8Bufferは完全です。へのポインタuint8_tであるため、アドレス演算で使用できます。*(*pu8Buffer + 1)(*pu8Buffer)[1]、および1[*pu8Buffer]はすべて、uint8_tを超えるものに対して有効な式です*pu8Buffer

于 2013-09-30T19:07:57.967 に答える