-1

私はSTRUCT1構造を以下のように宣言しています

typedef struct struct1 {
    short int nbr_fe;
    [size_is(nbr_fe)] STRUCT2  ptr_fe[*];
} STRUCT1;

STRUCT2もSTRUCT1内の別の構造です

そして、私はそれへのポインタを以下のように宣言しています

typedef [ptr] STRUCT1 * ptr;

そして、nbrRequestedに基づいてSTRUCT1の配列にメモリを割り当てる必要があります。これまでのところ、

STRUCT1 obj1;
memset((void*)&obj1, '\0' , sizeof(STRUCT1));

for(int i1=0;i1<(int)nbrRequested;i1++) {
   STRUCT2 obj2;
   memset((void*)&obj2, '\0' , sizeof(STRUCT2));
   obj1.ptr_fe[i1] = obj2;
}

ptr ptr2;
ptr2 = &obj1;

ただし、nbrRequestedが500より大きい場合、ループは無限になり、アプリケーションはハングします。

forループを使用せずにメモリを割り当てるより良い方法はありますか

4

3 に答える 3

3

このスニペットは、メモリを malloc する必要があることを明確にし、それをクリアしてから、ポインターを構造体メンバーに割り当てることができます。

STRUCT1 listWU;
memset(&listWU, 0 , sizeof(STRUCT1));
for(int i1=0; i1<(int)nbrRequested; i1++) {
    STRUCT2 *temp;
    temp = malloc(sizeoF(STRUCT2));
    memset(temp, 0 , sizeof(STRUCT2));
    listWU.lst_Workunit_fe[i1] = temp;
}

ああ、忘れないでください。この構造体を使い終わったら、この構造体でmalloc'd されたすべてのポインターを解放する必要があります。そうしないと、メモリ リークが発生します。

于 2009-02-10T13:16:14.607 に答える
2

何も割り当てていません。スタック上の同じデータを上書きしています(ループが終了すると、スコープ外になります。

C++ では、new 演算子を使用してメモリを割り当てます。C では malloc を使用します。したがって、コードの最小限の書き直しは次のようになります(Cでは、それがあなたが書いているように見えるため)

// Allocate enough space for the array of `WF_LIST_WORKUNIT_P_FE`s
WF_LIST_WORKUNIT_P_FE listWU = malloc(sizeof(WF_STRUCT_WORKUNIT_FE) * nbrRequested);
memset(listWU, 0, sizeof(WF_STRUCT_WORKUNIT_FE) * nbrRequested));

もちろん、これは、より意味のある初期化ではなく、配列内のすべての構造体を 0 に設定するだけです (それが必要な場合)。

于 2009-02-10T13:22:22.797 に答える
0

これはC++コードなので

以下のように新しい演算子を使用します

WF_LIST_WORKUNIT_P_FE *listWU = new WF_STRUCT_WORKUNIT_FE [nbrRequested + 1];

問題は、構造体 WF_STRUCT_WORKUNIT_FE 自体が構造体 WF_LIST_WORKUNIT_FE のネストされた構造体であり、typedef struct wf_list_workunit_fe
{ short int nbr_Workunits_fe;であるということです。[size_is(nbr_Workunits_fe)] WF_STRUCT_WORKUNIT_FE lst_Workunit_fe[*]; } WF_LIST_WORKUNIT_FE;

メモリを WF_LIST_WORKUNIT_FE 作業に割り当てませんか?

于 2009-02-10T14:41:12.217 に答える