Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 不会进入我的功能_C_Function_Tree_Segmentation Fault - Fatal编程技术网

C 不会进入我的功能

C 不会进入我的功能,c,function,tree,segmentation-fault,C,Function,Tree,Segmentation Fault,我是C编程的初学者。我目前正在尝试使用数组实现一个特殊的树。 当执行我的代码时,它停止说:进程结束,退出代码为11(分段错误)。出于某种原因,它在进入函数newTree之前停止。目前,我的程序所做的唯一事情是:它首先显示菜单,然后要求用户进行选择。之后,它要求用户输入根名称和值。由于某种原因,它会出现分段错误 这是我当前的代码: //struct typedef struct Tree { char *name; char *value; _Bool isLeaf; } Node; //arr

我是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;
}
//结构
类型定义结构树{
字符*名称;
字符*值;
_布尔岛;
}节点;
//排列
节点*树;
//定义我的功能
void-newTree(节点n);
void add_child(节点n1、节点n2、int child_loc);
内部主(空){
//菜单
printf(“树数据结构”);
printf(“选择以下选项之一:\n”);
printf(“1.创建一个只包含根节点n\n的新树”);
printf(“2.将新的子节点添加到n\n”);
printf(“3.Prune\n”);
printf(“4.列出子项\n”);
printf(“5.1.1”);
printf(“6.1.1\n”);
printf(“7.Search\n”);
printf(“选项:”);
节点n,n1,n2;
//创建所有节点

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

,您可以在
strcpy
调用中访问
tree[0]
,但从未为其分配内存。
  //creating all nodes
  for(int i=0; i<781; i++){
     Node i = {(char*)malloc(sizeof(char)*16),   (char*)malloc(sizeof(char)*80), 0};

  }
tree
只是一个全局指针,您可以将其声明为数组,或者如果需要在运行时更改大小,可以使用
malloc

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

  }
还没有测试


尚未测试。

您提供了指针“树”而不是数组“树”。您必须为指针“树”分配足够的内存,使其成为数组。您可以通过添加以下代码来完成此操作

tree=(Node*)malloc(数组的大小*节点的大小));


这将形成一个元素数为“大小数组”的数组。

也在for循环中声明i,但我认为在像前面所说的那样分配内存后,不需要循环。

您提供了指针“tree”而不是数组“tree”。您必须为指针“tree”分配足够的内存,使其成为数组。您可以通过添加以下代码来完成此操作

tree=(Node*)malloc(数组的大小*节点的大小));


这将形成一个元素数为“大小数组”的数组。

也在for循环中声明i,但我认为在分配完前面所说的内存后,不会需要该循环。

您可能对本次讨论感兴趣(这与您的问题没有直接关系)。虽然我找不到名为
createTree
的函数,但我假定您的意思是
newTree
。我假定您的代码打印
输入根值:
。请更具体地说明您的预期行为和实际行为。程序中的Node*tree仅声明“tree”作为指针。您必须将内存分配给树,使其成为数组。另外,我不明白一件事,通过创建数组并存储值,不能使其成为树。树中的每个节点之间必须有一些链接。您可能对本讨论感兴趣(这与您的问题没有直接关系)。虽然我找不到名为
createTree
的函数,但我假定您的意思是
newTree
。我假定您的代码打印
输入根值:
。请更具体地说明您的预期行为和实际行为。程序中的Node*tree仅声明“tree”作为指针。您必须为树分配内存,使其成为数组。另外,我不明白一件事,通过创建数组并存储值,不能使其成为树。树中的每个节点之间必须有某种链接。我做了类似的操作,但出于某种原因,它只显示了“输入根名称”。对于以前的版本,虽然没有意义,但它允许我在“输入根值”之后输入值。我做了类似的操作,但出于某种原因,它只显示了“输入根名称”。对于以前的版本,尽管没有意义,但它允许我在“输入根值”之后输入值。