-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在这个结构中的指针,否则你会发生内存泄漏。

于 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++ 代码

我会使用 new 运算符,如下所示

WF_LIST_WORKUNIT_P_FE *listWU = 新的 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 回答