【问题标题】:wont enter my function不会进入我的功能
【发布时间】:2016-12-13 12:01:55
【问题描述】:

我是 C 编程的初学者。我目前正在尝试使用数组实现一棵特殊的树。 执行我的代码时,它停止说:进程以退出代码 11 完成(分段错误)。由于某种原因,它在进入我的函数 newTree 之前就停止了。目前,我的程序唯一要做的就是:它首先显示菜单,然后要求用户选择。之后,它要求用户输入根名称和值。由于某种原因,它会产生分段错误。

这是我当前的代码:

//struct
typedef struct Tree {
char *name;
char *value;
_Bool isLeaf;
} Node;

//array
Node *tree;

//defining my functions
void newTree(Node n);
void add_child(Node n1, Node n2, int child_loc);

int main(void){
  //menu
  printf("The Tree Data Structure\n");
  printf("Choose one of the following options: \n");
  printf("1.Create a new tree consisting just of the root node n \n");
  printf("2.Add a new child node to n \n");
  printf("3.Prune \n");
  printf("4.List Children \n");
  printf("5.Traverse \n");
  printf("6.Graft \n");
  printf("7.Search \n");
  printf("Option: ");


  Node  n, n1, n2;

  //creating all nodes
  for(int i=0; i<781; i++){
     Node i = {(char*)malloc(sizeof(char)*16),   (char*)malloc(sizeof(char)*80), 0};

  }

 int option;
 scanf("%d", &option);

 switch(option){
    case 1:
        printf("Enter root name: ");
        scanf("%s", n.name);
        printf("Enter root value: ");
        scanf("%s", n.value);

        //my problem
        newTree(n);

        break;

        //other cases        

    default: printf("Incorrect option");
        break;
  }
return 0;

}

void newTree(Node n) {

  strcpy(tree[0].name,n.name);
  strcpy(tree[0].value,n.value);

  int first_child_loc;
  first_child_loc = 0;
  //0 because first tree: tree[0]
  first_child_loc = (0*5)+1;

  if(strcmp("",tree[first_child_loc].name) == 0){
      n.isLeaf = 1;
  }else{
      n.isLeaf = 0;
  }
  tree[0].isLeaf = n.isLeaf;
}

非常感谢。

【问题讨论】:

  • 您可能对此讨论感兴趣(与您的问题没有直接关系)stackoverflow.com/questions/605845/…。虽然我找不到名为createTree的函数,但我假设您的意思是newTree。我假设你的代码打印Enter root value: 。更具体地说明您的预期行为是什么以及实际行为是什么。
  • 程序中的节点 *tree 只是将“tree”声明为指针。您必须为树分配内存,使其成为一个数组。另外,我不明白一件事,通过创建一个数组并存储值,并不能使它成为一棵树。树中的每个节点之间必须有某种联系。

标签: c function tree segmentation-fault


【解决方案1】:

您提供的是指针“树”而不是数组“树”。您必须为指针 "tree" 分配足够的内存,以使其成为数组。您可以通过添加以下代码来做到这一点

tree=(Node*)malloc(size_of_array*sizeof(Node));

这将形成一个包含“size_of_array”个元素的数组。
还要在 for 循环中声明 i,但我认为在分配内存后不需要循环。

【讨论】:

    【解决方案2】:

    newTree 中,您在strcpy 调用中访问tree[0],但您从未为它分配内存。 tree 只是一个全局指针,您可以将其声明为数组,或者如果您需要在运行时更改大小,您可以使用 malloc

    【讨论】:

      【解决方案3】:
        //creating all nodes
        for(int i=0; i<781; i++){
           Node i = {(char*)malloc(sizeof(char)*16),   (char*)malloc(sizeof(char)*80), 0};
      
        }
      

      我还没有检查你的整个程序,但是这个 for 循环肯定不会工作。 你有一个int i 所以i 已经被声明和初始化了。现在你说 i 来自 Node 类型,这将导致错误。 尝试类似:

      Node tree[781];
      for(int i=0; i<781; i++){
           tree[i].name = (char*)malloc(sizeof(char)*16);
           tree[i].value = (char*)malloc(sizeof(char)*80);
      }
      

      尚未测试。

      【讨论】:

      • 我做过类似的事情,但由于某种原因,它只显示“输入根名称”。用以前的版本,虽然没有意义,但它允许我在“输入根值”之后输入一个值。
      猜你喜欢
      • 2018-06-29
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 2017-10-26
      • 2018-11-10
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      相关资源
      最近更新 更多