Realloc:在结构中重置struct的flexable数组

时间:2016-02-19 20:32:27

标签: c struct realloc

我一直用这个把头撞在墙上。我能够将其缩小到我的代码的realloc部分。

ActiveDataProvider

CalComp是一个由以下内容组成的结构:

CalStatus readCalComp( FILE *const ics, CalComp **const pcomp )
    {
    CalStatus test;
    CalProp * foldLine;
    CalProp * temp;
    CalComp ** subComp;
    char * buffer;
    static int depth = 0;
    int count = 0;
    int i = 0;

    buffer = NULL;
    foldLine = NULL;
    subComp = NULL;

    if (depth == 0)
    {
        test = readCalLine (ics, &buffer);

        if (buffer == NULL)
        {
            return test;
        }
        foldLine = malloc (sizeof (CalProp));
        assert (foldLine != NULL);
        test.code = parseCalProp (buffer, foldLine);
        free (buffer);

        if ((strcmp ("BEGIN", foldLine->name) == 0) && ((strcmp ("VCALENDAR", foldLine->value) == 0)))
        {
            (*pcomp)->name = malloc (sizeof(char) * strlen(foldLine->value)+1);
            assert ((*pcomp)->name != NULL);
            strcpy((*pcomp)->name, foldLine->value);
            depth = depth + 1;

            free(foldLine->name);
            free(foldLine->value);
            free(foldLine);

            while ((buffer != NULL) && (test.code == OK) && (depth > 0))
            {
                test = readCalLine (ics, &buffer);

                if (buffer != NULL)
                {
                    foldLine = malloc (sizeof(CalProp));
                    assert (foldLine != NULL);
                    test.code = parseCalProp (buffer, foldLine);
                    free (buffer);

                    if ((strcmp ("END", foldLine->name) == 0) && ((strcmp ("VCALENDAR", foldLine->value) == 0) || (strcmp ("VCALENDAR\r\n", foldLine->value) == 0) ))
                    {
                        depth = depth - 1;

                        free(foldLine->name);
                        free(foldLine->value);
                        free(foldLine);

                        return test;
                    }
                    else if (strcmp ("BEGIN", foldLine->name) == 0)
                    {
                        subComp = malloc(sizeof (CalComp *));
                        *subComp = malloc(sizeof(CalComp) + (1*sizeof(CalComp*)));

                        (*subComp)-> name = NULL;
                        (*subComp)-> nprops = 0;
                        (*subComp)-> prop = NULL;
                        (*subComp)-> ncomps = 0;
                        (*subComp)-> comp[0] = NULL;

                        (*subComp)-> name = malloc(sizeof(char) *strlen(foldLine->value)+1);
                        strcpy((*subComp)->name, foldLine->value);

                        if ((*pcomp)-> ncomps == 0)
                        {
                            (*pcomp)->comp[(*pcomp)->ncomps] = *subComp;
                            (*pcomp)->ncomps += 1;
                        }
                        else
                        {
                            (*pcomp)->ncomps += 1;
                            *pcomp = realloc(*pcomp, sizeof(CalComp) + (2*sizeof(CalComp*)));
                            (*pcomp)->comp[(*pcomp)->ncomps-1] = *subComp;
                        }

                        depth = depth + 1;

                        test = readCalComp (ics, subComp);
                    }
                } // end of if buffer NULL
            }// end of While
        } // end of if VCALENDAR
    } // End of if Depth
    else
    {
        if (count == 0)
        {
            test = readCalLine (ics, &buffer);
            count += 1;
        }

        while ((test.code == OK) && (buffer != NULL))
        {
            if (count != 1)
            {
                test = readCalLine (ics, &buffer);
            }
            else
            {
                count = 0;
            }

            if (buffer != NULL)
            {
                foldLine = malloc (sizeof(CalProp));
                test.code = parseCalProp (buffer, foldLine);
                free (buffer);

                if ((strcmp ("END", foldLine->name) == 0) && ((strcmp ((*pcomp)->name, foldLine->value) == 0)))
                {
                    depth = depth - 1;

                    free (foldLine->name);
                    free (foldLine->value);
                    free (foldLine);

                    return test;
                }
                else if (strcmp ("BEGIN", foldLine->name) == 0)
                {
                    printf("Success in malloc 2!\n");
                    subComp = malloc(sizeof (CalComp *));
                    *subComp = malloc(sizeof(CalComp) + (1*sizeof(CalComp*)));

                    (*subComp)-> name = NULL;
                    (*subComp)-> nprops = 0;
                    (*subComp)-> prop = NULL;
                    (*subComp)-> ncomps = 0;
                    (*subComp)-> comp[0] = NULL;

                    (*subComp)-> name = malloc(sizeof(char) *strlen(foldLine->value)+1);
                    strcpy ((*subComp)->name, foldLine->value);

                    if ((*pcomp)-> ncomps == 0)
                    {
                        (*pcomp)->comp[(*pcomp)->ncomps] = *subComp;
                        (*pcomp)->ncomps += 1;
                    }
                    else
                    {
                        (*pcomp)->ncomps += 1;
                        (*pcomp) = realloc(*pcomp, sizeof(CalComp) + (2*sizeof(CalComp*)));
                        (*pcomp)->comp[(*pcomp)->ncomps-1] = *subComp;
                        printf ("First subcomponent is %s\n", (*pcomp)->comp[0]->name);
                        printf ("Second subcomponent is %s\n", (*pcomp)->comp[1]->name);
                    }

                    depth = depth + 1;

                    test = readCalComp (ics, subComp);
                }
            }
        }
    }

        return test;
  }

在函数内部检查,灵活数组中的结构名称是正确的,但是当我尝试访问函数外部的名称时,它要么是NULL值,要么是设置为第一个链表节点的名称结构。

由于赋值的性质,我不能修改Calcomp结构,也不能修改函数参数。该函数必须是递归的,灵活的数组必须根据需要进行调整。

正如我之前所说的,我通过打印灵活数组中的值将其缩小到realloc。程序重新分配时会发生错误。

仅供参考,我已经尝试重新分配到临时变量,检查是否为NULL,然后将该分配给pcomp但没有帮助。

2 个答案:

答案 0 :(得分:1)

当您致电realloc时,如果您没有将ncomp包含在灵活结构的额外尺寸中,那么您只需将其硬编码为2即可。

(*pcomp) = realloc(*pcomp, sizeof(CalComp) + (*pcomp->ncomps * sizeof(CalComp*)));

答案 1 :(得分:0)

(*pcomp) = realloc(*pcomp, sizeof(CalComp) + (2*sizeof(CalComp*)));

将上一行更改为

pcomp = realloc(*pcomp, sizeof(CalComp) + (2*sizeof(CalComp*)));