1

私は、一見初歩的な問題にかなりの難問を抱えていると言わざるを得ません。配列をフィールドとして格納したい構造があります。この構造をさまざまなコンテキストで再利用したいのですが、より大きな配列が必要な場合もあれば、より小さな配列が必要な場合もあります。C では、可変サイズ バッファの使用が禁止されています。したがって、自然なアプローチは、この配列へのポインターを構造体メンバーとして宣言することです。

struct my {
    struct other* array;
}

ただし、このアプローチの問題点は、動的メモリ割り当てを禁止する MISRA-C の規則に従わなければならないことです。したがって、メモリを割り当てて配列を初期化したい場合は、次のようにする必要があります。

var.array = malloc(n * sizeof(...));

MISRA 規格で禁止されています。他にどうすればこれを行うことができますか?

4

3 に答える 3

2

MISRA-C に従っているので、ソフトウェアがミッション クリティカルであると推測できます。その場合、すべてのメモリ割り当ては決定論的でなければなりません。ヒープ割り当ては、MISRA-C だけでなく、より一般的な安全基準 (IEC 61508、ISO 26262、DO-178 など) でも、あらゆる安全基準によって禁止されています。

このようなシステムでは、メモリを最も消費する最悪のシナリオを常に想定して設計する必要があります。正確にそれだけのスペースを割り当てる必要があります。それ以上でもそれ以下でもありません。そのようなシステムでは、他のすべては意味がありません。

これらの前提条件を考慮して、 size の静的バッファーを割り当てる必要がありますLARGE_ENOUGH_FOR_WORST_CASE。これに気付いたら、列挙型とおそらく「使用サイズ」カウンターを使用して、このバッファーに格納したデータの種類を追跡する方法を見つける必要があります。


malloc/calloc だけでなく、VLA やフレキシブル配列メンバーも MISRA-C:2012 で禁止されていることに注意してください。また、C90/MISRA-C:2004 を使用している場合、VLA はなく、柔軟な配列メンバーの明確に定義された使用法もありません。C99 まで未定義の動作を呼び出していました。

于 2015-04-08T11:08:56.607 に答える
0

これはあなたの状況にはまったく不適切かもしれない考えですが、あなたの制約を考えると、他にどのように対処すればよいかわかりません。

大きな静的配列を作成し、これを「ヒープ」として使用します。

static struct other heap[SOME_BIG_NUMBER];

次に、この「ヒープ」から次のようにメモリを「割り当て」ます。

var.array = &heap[start_point];

「ヒープ」のどの部分が割り当てられているかを追跡するために、簿記を行う必要があります。これは、実行可能ファイルのサイズに大きな制約がないことを前提としています。

于 2015-04-07T14:41:37.710 に答える