ошибка сегментации при использовании массива указателей на структуры - PullRequest
0 голосов
/ 14 февраля 2012

Я должен сохранить в массиве адрес некоторых данных.Каждые данные представляют собой структуру типа «dagNode».Чтобы выполнить свою работу, я захожу в список и подсчитываю количество данных, для которых я хочу записать его адрес, поэтому я выделяю нужное место в памяти, и, наконец, я снова посещаю список и сохраняю адрес некоторых данных.

    struct dagNode *buildBST(struct dagNode *rootList){
    struct dagNode *head, **xTest;
    head = rootList;
    int numXtest=0;

    rootList = nextNode(TYPE_XTEST, rootList);

    while ( !IS_TERMINATED( rootList ) ){   // first visit
        numXtest++;
        rootList = nextNode(TYPE_XTEST, rootList); }

    xTest = (struct dagNode **) malloc( sizeof(struct dagNode ) * numXtest);
    int i=0; rootList = nextNode(TYPE_XTEST, head);

    for(i=0; i<numXtest; i++){      // second visit, saving the address of some datas
        rootList = nextNode(TYPE_XTEST, rootList);
        xTest[i] = rootList; i++;
    >>> printf("t=%d,val=%d\t", xTest[i]->nodeType, xTest[i]->val); } // segmentation fault

    return head;
    }

РЕДАКТИРОВАТЬ:

    struct dagNode *nextNode(int typeOfNextNode, struct dagNode *node){
        if (IS_TERMINATED(node)){   return node;    }
        node = node->next;
        if (typeOfNextNode == TYPE_EDGE_OR_GAP){
            while (!IS_TERMINATED(node) && !IS_AN_EDGE(node) && !IS_A_GAP(node)){
                node = node->next;  }
               }else
        {
            while (!IS_TERMINATED(node) && (node->nodeType != typeOfNextNode)){
                node = node->next;}
        }
        return node;    }

Ответы [ 3 ]

2 голосов
/ 14 февраля 2012

nextNode() кажется очевидным виновником.

Edit: Обратите внимание, что вы также увеличиваете i дважды за итерации. Это обязательно приведет к краху.

1 голос
/ 14 февраля 2012

Несоответствие между типом указателя xTest и размером, указанным в malloc. Если xTest имеет тип struct dagNode **, правильное распределение должно быть:

xTest = malloc(sizeof(struct dagNode *) * numXtest);

Возможно, вы хотите выделить numXtest указателей для структуры, а не numXtest структур.

0 голосов
/ 14 февраля 2012

Извините, но этот пост не отвечает на вопрос.Я просто хочу привести пример альтернативного стиля кодирования.Возьмите то, что вам нравится.

Я не изменил значение кода, за исключением удаления наиболее очевидных ошибок, уже отмеченных в других ответах / комментариях.

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
  ...
} dagNode;

dagNode* buildBST (dagNode* rootList)
{
  dagNode*  head;
  dagNode** xTest;
  int numXtest=0;
  int i=0;

  head = rootList;
  rootList = nextNode(TYPE_XTEST, rootList);

  while (!IS_TERMINATED(rootList))               // first visit
  {
    numXtest++;
    rootList = nextNode(TYPE_XTEST, rootList);
  }

  xTest = malloc(sizeof(dagNode) * numXtest);
  rootList = nextNode(TYPE_XTEST, head);

  for(i=0; i<numXtest; i++)                      // second visit, saving the address of some datas
  {      
    rootList = nextNode(TYPE_XTEST, rootList);
    xTest[i] = rootList;

    printf("t=%d,val=%d\t", 
           xTest[i]->nodeType,
           xTest[i]->val);
  }

  return head;
}


dagNode *nextNode (int typeOfNextNode, dagNode *node)
{
  if (IS_TERMINATED(node))
  {
    return node;
  }

  node = node->next;

  if (typeOfNextNode == TYPE_EDGE_OR_GAP)
  {
    while ( !IS_TERMINATED(node) &&
            !IS_AN_EDGE(node) &&
            !IS_A_GAP(node) )
    {
      node = node->next;
    }
  }
  else
  {
    while ( !IS_TERMINATED(node) &&
            (node->nodeType != typeOfNextNode) )
    {
      node = node->next;
    }
  }

  return node;
}
...