我应该做一个程序,从现有数组构建一棵树,并带有一些属性。我的问题不是关于如何做到这一点(我应该做一些递归功能,没关系),因为当我尝试启动构建功能时,我遇到了一些分段错误。所以我试图"隔离"这个问题,当我创建树的根节点时,我看到我遇到了它。我真的不明白为什么我有这个错误(因为我已经使用列表一段时间了,所以,即使我不是大师,我在指针和链接结构方面也不是全新的)。我试图编写一个非常简单的主代码来查看正在发生的事情,我发现我甚至无法初始化单个节点。这是代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct elem {
int info;
struct elem *p;
struct elem *left;
struct elem *right;
} tree;
typedef tree* tree_punt;
void fill(int *array, int size) {
int i;
for(i=0; i<size; i++) {
array[i] = i+1;
}
}
void show(int *array, int size) {
int i;
for(i=0; i<size; i++) {
printf("%d ", array[i]);
}
printf("n");
}
int main() {
int *array;
int size;
size = 7;
fill(array, size);
show(array, size);
printf("array "address": %dn", array);
tree_punt test;
printf("tree "address": %dn", test);
test = (tree_punt)malloc(sizeof(tree));
test->info = 5;
printf("info: %dn", test->info);
}
当我将malloc用于测试指针时,我遇到了分段错误。奇怪的是,如果我不将值放入数组中,我就没有问题....为什么?为什么阵列要打扰我可怜的树?
使用未初始化的指针:
int *array;
fill(array, size);
array
不会指向任何地方,试图将其传递给fill
会导致未定义的行为。
要解决此问题,您可以更改为:
int size = 7;
int array[size];
除了不初始化int
数组之外,还可以打印一个具有垃圾值的变量:
tree_punt test;
printf("tree "address": %dn", test);
test = (tree_punt)malloc(sizeof(tree));
在这里,您正在打印test
,然后它才具有任何有意义的价值。只需切换最后两行,不要使用%d
而是%p
(因为它是指针而不是整数)。