在c中使函数指针成为结构成员
Make function pointers members of structures in c
当我使用 C 时,我完全是菜鸟。指针非常弱。
我已经为二叉搜索树编写了一个结构。但是当我尝试从代码访问它时,它会抛出一个错误:
Process terminating with default action of signal 11 (SIGSEGV).
Bad permissions for mapped region at address 0x0`.
这是我的结构(在 bst.h
中):
typedef struct tree Tree;
typedef struct tree{
Node * root;
Data * (*insert)(Tree * bst, Data value); //i get error in main when I make a call
Data * (*search)(Tree * bst, Data value);
void (*sort)(Tree *, Data *);
int (*compare)(Tree *t, Tree * copy);
Tree * (*clone)(Tree *t);
void (*delete)(Tree *bst);
void (*removeData)(Tree * bst, Data value);
}Tree;
成员函数(在bst.c
):
Node * newNode(Data data, Node * parent) {
printf("inside new node\n");
Node * node = malloc(sizeof(Node));
if(parent!=NULL) {
if((parent->data.value)> data.value) {
parent->left=node;
}
else {
parent->right=node;
}
}
node->parent=parent;
node->left=NULL;
node->right=NULL;
node->data=data;
printf("after inside newNode\n");
return node;
}
Tree * newTree() {
Tree *tree;
tree = (Tree*)malloc(sizeof(Tree));
tree->root=NULL;
return tree;
}
// not getting inside in this function
Data * insert(Tree * tree, Data data) {
if(tree->root==NULL) {
tree->root = newNode(data,NULL);
} else{
return insertNode(tree->root,data);
}
return NULL;
}
这是我的 main()
调用此函数(在 main.c
中):
Tree *bst = newTree();
assert(bst->root == NULL);
printf("1.");
for (i = 0; i < num_data; i++){
bst->insert(bst, (Data){d[i]});
printf("inside for loop");
}
我不确定这是否是将函数指针作为结构成员的正确方法。
在 newTree()
中,您没有将函数分配给分配的 tree
结构内的函数指针。
Data* insert(Tree* tree, Data data);
// other function declarations as needed...
Tree* newTree() {
Tree *tree = (Tree*) malloc(sizeof(Tree));
if (!tree) return NULL;
tree->root = NULL;
tree->insert = &insert; // <-- ADD THIS!
// and do the same for your other function pointers...
tree->search = ...;
tree->sort = ...;
tree->compare = ...;
tree->clone = ...;
tree->delete = ...;
tree->removeData = ...;
return tree;
}
当我使用 C 时,我完全是菜鸟。指针非常弱。
我已经为二叉搜索树编写了一个结构。但是当我尝试从代码访问它时,它会抛出一个错误:
Process terminating with default action of signal 11 (SIGSEGV). Bad permissions for mapped region at address 0x0`.
这是我的结构(在 bst.h
中):
typedef struct tree Tree;
typedef struct tree{
Node * root;
Data * (*insert)(Tree * bst, Data value); //i get error in main when I make a call
Data * (*search)(Tree * bst, Data value);
void (*sort)(Tree *, Data *);
int (*compare)(Tree *t, Tree * copy);
Tree * (*clone)(Tree *t);
void (*delete)(Tree *bst);
void (*removeData)(Tree * bst, Data value);
}Tree;
成员函数(在bst.c
):
Node * newNode(Data data, Node * parent) {
printf("inside new node\n");
Node * node = malloc(sizeof(Node));
if(parent!=NULL) {
if((parent->data.value)> data.value) {
parent->left=node;
}
else {
parent->right=node;
}
}
node->parent=parent;
node->left=NULL;
node->right=NULL;
node->data=data;
printf("after inside newNode\n");
return node;
}
Tree * newTree() {
Tree *tree;
tree = (Tree*)malloc(sizeof(Tree));
tree->root=NULL;
return tree;
}
// not getting inside in this function
Data * insert(Tree * tree, Data data) {
if(tree->root==NULL) {
tree->root = newNode(data,NULL);
} else{
return insertNode(tree->root,data);
}
return NULL;
}
这是我的 main()
调用此函数(在 main.c
中):
Tree *bst = newTree();
assert(bst->root == NULL);
printf("1.");
for (i = 0; i < num_data; i++){
bst->insert(bst, (Data){d[i]});
printf("inside for loop");
}
我不确定这是否是将函数指针作为结构成员的正确方法。
在 newTree()
中,您没有将函数分配给分配的 tree
结构内的函数指针。
Data* insert(Tree* tree, Data data);
// other function declarations as needed...
Tree* newTree() {
Tree *tree = (Tree*) malloc(sizeof(Tree));
if (!tree) return NULL;
tree->root = NULL;
tree->insert = &insert; // <-- ADD THIS!
// and do the same for your other function pointers...
tree->search = ...;
tree->sort = ...;
tree->compare = ...;
tree->clone = ...;
tree->delete = ...;
tree->removeData = ...;
return tree;
}