узел дает значение мусора - PullRequest
0 голосов
/ 19 апреля 2010

я делаю программу c двоичным деревом, вставляя узел в дерево после 2 или 3 узлов, у которых дочерний узел имеет значение мусора и происходит сбой, я делаю в xcode любую идею ...

Bnode createTreeNode()
{
    Bnode node=(Bnode)malloc(sizeof(Bnode));
    return node;    
}

Bnode addTreeNode(Bnode inNode, char *inData)
{
    int compareValue;

    if (inNode == NULL)     
    {
        inNode = createTreeNode();

        inNode->leftNode=NULL;            
        inNode->rightNode=NULL;

        stpcpy(inNode->data,inData);        
    }
    else if((compareValue=strcmp(inData,inNode->data))==0)       
    {        
        inNode->count=inNode->count+1;

    }
    else if(compareValue>1)        
    {        
        inNode->rightNode=addTreeNode(inNode->rightNode,inData);    
    }
    else        
    {            
        inNode->leftNode = addTreeNode(inNode->leftNode,inData);        
    }

    return inNode;    
}

так я создаю узел и вставляю его в дерево.

Ответы [ 2 ]

2 голосов
/ 20 апреля 2010
Bnode node=(Bnode)malloc(sizeof(Bnode)); //[1]
    return node;   

Аргумент malloc - размер динамической памяти, выделяемой.

Вы указали размер указателя на структуру в качестве аргумента вместо размера самой структуры .
В результате на Bnode выделяется меньше памяти, и в конечном итоге вы неизбежно получите значения мусора и ошибки сегментации.


Измените его на что-то вроде

Bnode node = malloc(sizeof(struct _bnode));
//where Bnode is pointer to struct _bnode

P.S .: [1] Явные приведения (Bnode) не требуются в C.

1 голос
/ 19 апреля 2010

Вы объявили указатель для своего узла, но вы фактически не выделяли для него никакого хранилища, поэтому у вас есть висячий указатель . Вам необходимо вызвать malloc() (или calloc()) для каждого нового узла, чтобы выделить хранилище.

...