我是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;
}
非常感谢你。
答案 0 :(得分:1)
在sentence = "ask not what your country can do for you ask what you can do for your country"
words = sentence.split(' ')
new = [str(words.index(x)) for x in words]
print(words)
print(new)
中,您在newTree
来电中访问tree[0]
,但您从未为其分配内存。
strcpy
只是一个全局指针,您可以将其声明为数组,或者如果您需要在运行时更改大小,可以使用tree
。
答案 1 :(得分:1)
您提供了一个指针“tree”而不是一个数组“tree”。您必须为指针“tree”分配足够的内存,以使其成为一个数组。您可以通过添加以下代码来实现此目的
tree=(Node*)malloc(size_of_array*sizeof(Node));
这将形成一个“size_of_array”数量的元素数组
同样在for循环中声明我,但我不认为在分配内存之后将需要循环。
答案 2 :(得分:0)
//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);
}
尚未测试。