2009-02-10 211 views
-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循環

+0

這讀起來更像C而不是C++。你確定你的意思是聲稱這是C++嗎? – jasedit 2009-02-10 13:08:06

+0

這不是C. [size_is]是MS託管C++擴展。 – 2009-02-10 13:13:56

回答

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,而不是一個更有意義的初始化,如果這是你想要的。

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倒是在這個結構或者你有內存泄漏的指針。

0

由於這是一個C++代碼

我想使用新的運營商如下

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

美中不足的是結構WF_STRUCT_WORKUNIT_FE本身是結構的嵌套結構WF_LIST_WORKUNIT_FE 即 typedef結構wf_list_workunit_fe
{ 短整型nbr_Workunits_fe; [size_is(nbr_Workunits_fe)] WF_STRUCT_WORKUNIT_FE lst_Workunit_fe [*]; } WF_LIST_WORKUNIT_FE;

會不會爲WF_LIST_WORKUNIT_FE工作分配內存?