Frage

Ich habe die STRUCT1 Struktur erklärt, wie unten

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

struct2 ist auch eine andere Struktur innerhalb STRUCT1

und dann habe ich einen Zeiger auf sie erklärt, wie unten

typedef [ptr] STRUCT1 * ptr;

Und ich habe eine Erinnerung an eine Anordnung von STRUCT1 Basis auf dem nbrRequested zuzuteilen Und so weit ich habe

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;

aber wenn die nbrRequested größer als 500 ist, geht die Schleife in unendlich und der Anwendung hängt.

Gibt es einen besseren Weg, um einen Speicher ohne Verwendung für Schleife

zuzuteilen
War es hilfreich?

Lösung

Sie sind Zuteilung nichts, du bist die gleichen Daten auf dem Stack überschreiben (die dann den Gültigkeitsbereich verlässt, wenn die Schleife beendet.

In C ++ ordnen Sie Speicher mit dem neuen Betreiber. In C würden Sie malloc verwenden. So eine minimale Umschreiben des Codes würde so etwas wie diese (in C, da das scheint zu sein, was Sie schreiben)

// 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));

Natürlich setzt dies nur jede Struktur im Array auf 0, sondern als eine sinnvolle Initialisierung, wenn das ist, was Sie wollen.

Andere Tipps

sollten Dieser Code-Schnipsel aufklären, dass Sie die Erinnerung, deaktivieren Sie es, malloc benötigen, dann können Sie die Zeiger zu dem Strukturelement zugeordnet werden.

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;
}

Oh, und vergessen Sie nicht, wenn Sie mit dieser Struktur fertig sind, müssen Sie alle Hinweise befreien, die in dieser Struktur malloc'd wurden oder werden Sie einen Speicherverlust haben.

Da es sich um einen C ++ Code

würde ich neue Betreiber, wie unten

verwenden

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

Die Fangstruktur ist WF_STRUCT_WORKUNIT_FE selbst eine verschachtelte Struktur des Bauwerks WF_LIST_WORKUNIT_FE ist das ist  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;

wouldnt einen Speicher WF_LIST_WORKUNIT_FE Arbeit Zuweisung?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top