繁体   English   中英

内存分配

[英]Memory allocation

我有如下声明的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循环

此代码段应清除您需要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分配的所有指针,否则会发生内存泄漏。

您没有分配任何内容,而是覆盖了堆栈上的相同数据(然后在退出循环时超出范围)。

在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,而不是更有意义的初始化(如果您要这样做)。

由于这是C ++代码

我将使用以下新运算符

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工作分配内存吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM