结构的动态分配和设置指针

时间:2012-09-04 07:57:13

标签: c pointers data-structures xml-parsing

我为结构分配了5个位置 - 其中每个CELL都是指向结构的指针。现在我希望第二个单元格指向我的结构但是我得到一个错误:表达式必须是可修改的值。 我明白我正在重新定位指针,但我不明白如何在不复制所有值的情况下修复它。

这是我正在使用的例子:(相关的东西)

    typedef struct childrenArray
{
    PXML_ELEMENT    childrenArray;
     UINT32         numOfChildren;
     UINT32         maxNumOfChildren;
 }CHILDREN_ARR,*PCHILDREN_ARR;




 typedef struct xml_Element
 {    
     PDATA_ELEMENT           pData;
     PCHILDREN_ARR          pChildrenArr;
     PXML_ELEMENT           pParent;
     PATTR_ARR              pAttributeArr;
     UINT32                     depth;
  };

当我创建子数组时: 代码是:

PCHILDREN_ARR retArr;
retArr->childrenArray = (PXML_ELEMENT)Calloc(retArr->maxNumOfChildren ,sizeof(XML_ELEMENT)); /*my max is 5 .. */

现在我遇到了问题: 我想使用这个功能:

XML_STATUS xml_AddChildToEndArray(PXML_ELEMENT pChild , PXML_ELEMENT pParent)
{
     pParent->pChildrenArr->childrenArray + pParent->pChildrenArr->numOfChildren = pChild;
}

我得到了错误......我可以解释为什么这是错误的 我该如何解决?

我不想:

'currentCell ->name = pChild-> name'

复制所有值...只是为了让它指向孩子

谢谢!

1 个答案:

答案 0 :(得分:0)

如果我理解你的错误,你想将一个项目附加到结构childrenArray中的“数组”childrenArray

首先,您必须确保为新阵列分配了足够的空间。这可以用例如realloc

也许是这样的:

/* Allocate space for one more entry */
pParent->pChildrenArr->childrenArray =
    realloc(pParent->pChildrenArr->childrenArray,
            (pParent->pChildrenArr->numOfChildren + 1) * sizeof(XML_ELEMENT));

/* Copy the entry to the new place */
pParent->pChildrenArr->childrenArray[pParent->pChildrenArr->numOfChildren] = *pChild;

/* One more child now */
pParent->pChildrenArr->numOfChildren++;

编辑:您似乎已经有一个分配了最多条目数的数组,那么您不必重新分配:

if (pParent->pChildrenArr->numOfChildren < pParent->pChildrenArr->maxNumOfChildren)
{
    pParent->pChildrenArr->childrenArray[pParent->pChildrenArr->numOfChildren] = *pChild;
    pParent->pChildrenArr->numOfChildren++;
}

如果要在需要时增加数组的大小,则必须将这两种方法结合起来:

PCHILDREN_ARR pArray = pParent->pChildrenArr;

if (pArray->numOfChildren >= pArray->maxNumOfChildren)
{
    /* We need to reallocate */
    pArray->maxNumOfChildren += 5;

    pArray->childrenArray = realloc(pArray->childrenArray,
                                    pArray->maxNumOfChildren * sizeof(XML_ELEMENT));
}

pArray->childrenArray[pArray->numOfChildren++] = *pChild;