分割错误和核心转储

问题描述:

我一直在尝试编写我自己的二叉树。这似乎是工作,直到我想扫描新的字符串添加。相同的字符串工作,新的字符串给我分段错误&核心转储。我怀疑mallocing新元素的内存有问题。分割错误和核心转储

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
//------- wezel -------// 
struct node{ 
char *word; 
unsigned int arity; 
struct node *left, *right, *parent; 
}; 
struct node *root; 
/* Adding new string to tree */ 
void dopisz(char wordtmp[50], struct node *start){ 

    if(root==NULL){ // empty tree, add as root 
    root=(struct node*)malloc(sizeof *root); 
    root->word=(char*)malloc(sizeof wordtmp); 
    root->word=strcpy(root->word, wordtmp); 
    root->arity=1; 
    root->left=NULL; 
    root->right=NULL; 
    root->parent=NULL; 
    } 
    else if(strcmp(wordtmp, start->word)==0){ 
     start->arity=start->arity+1; 
    } 
    else if(strcmp(wordtmp, start->word)<0){ //if the added element is < 
     if(start->left==NULL){ //if there's no left son 
      struct node *nowy=(struct node*)malloc(sizeof *root); 
      nowy->word=strcpy(nowy->word, wordtmp); 
      nowy->arity=1; 
      nowy->left=NULL; 
      nowy->right=NULL; 
      nowy->parent=start; 
      start->left=nowy; 
     } 
     else if(start->left!=NULL){ //if there's left son 
      dopisz(wordtmp, start->left); 
     } 

    } 
    else if(strcmp(wordtmp, start->word)>0){ //if the added element is > 
     if(start->right==NULL){ //if there's no right son 
      struct node *nowy=(struct node*)malloc(sizeof *root); 
      nowy->word=strcpy(nowy->word, wordtmp); 
      nowy->arity=1; 
      nowy->left=NULL; 
      nowy->right=NULL; 
      nowy->parent=start; 
      start->right=nowy; 
     } 
     else if(start->right!=NULL){ //if there's right son 
      dopisz(wordtmp, start->right); 
     } 

    } 


} 
//-------looking for minimum -------// 
struct node* least(struct node *start){ 
    if(start->left != NULL){ 
     return least(start->left); 
    } 
    else return start; 
} 

//------- deleting -------// 
void usun(){ 

} 
//------- printing -------// 
void drukuj(struct node *start){ //printing in order in order 
    if(start->left!=NULL){ 
     drukuj(start->left); 
    } 
    printf("%s (%d)\n", start->word, start->arity); 
    if(start->right!=NULL){ 
     drukuj(start->right); 
    } 
} 
//------- main -------// 
int main(){ 
char wordtmp[50]; 
printf("\t Drzewo Poszukiwan Binarnych \n------------------------\n\n"); 
int x, y=0; 
while(y==0){ 
    printf("\n MENU: \n 0 -> zakoncz \n 1 -> dopisz\n 2 -> usun\n 3 -> drukuj\n\n"); // 0 - exit, 1 - add, 2 - delete, 3 - print 
    scanf("%d", &x); 
    switch(x){ 
    case 0: y++;  break; 
    case 1: 
    printf("wpisz slowo: "); 
    scanf("%s", wordtmp); 
    dopisz(wordtmp, root); 
    break; 
    case 2: usun();  break; 
    case 3: drukuj(root); break; 
    } 
} 
return 0; 
} 
+1

运行解决这个问题。 – djechlin

线

nowy->word=strcpy(nowy->word, wordtmp); 

是错误的。 nowy->word没有任何存储指向任意内存。将字符串复制到它有未定义的结果,但可能会出现seg错误。

您可以通过word一个固定大小的阵列中node的定义或通过在调试器它动态地分配存储器

nowy->word=malloc(strlen(wordtmp)+1); 
strcpy(nowy->word, wordtmp); 

nowy->word=strdup(wordtmp); // not standard C but available in Posix systems 
+0

谢谢先生。我还没有关于nowy-> word本身的mallocing内存。这就说得通了。 – Tomasz