我的calloc有问题,但我不知道为什么。这是我的代码:
void ens_init(ensemble* node, ullong value, uint i){
// *node = malloc(sizeof(struct ensemble)); # Doesn't work
// *node = calloc(1, sizeof(struct ensemble)); # Doesn't work
node = calloc(1, sizeof(struct ensemble));
if (*node == NULL){
printf("Caloc errorn");
exit(-1);
}
(*node)->key = value;
(*node)->index = i;
(*node)->left = NULL;
(*node)->right = NULL;
}
这是我的集成结构:
typedef unsigned int uint;
typedef unsigned long long int ullong;
struct ensemble{
ullong key;
uint index;
struct ensemble* left;
struct ensemble* right;
};
typedef struct ensemble* ensemble;
在处理非确定性有限自动机(法语为NFA或AFN(时,这就是我使用这种结构的原因。我的老师想编程一个函数来确定NFA,在这个函数中我们必须使用树。
以下是我如何调用此函数来测试
int main(int argc, char *argv[]){
ensemble B = NULL;
ens_ajouter(&B, 5, 1);
return 0;
}
感谢您的帮助:(
在调用初始化函数ens_init()
之前,尝试调用函数ens_ajouter()
。这意味着从未从main()
函数调用函数calloc()
。
我认为您错误地隐藏了类型ensemble
是指向struct ensemble
的指针这一事实。这会使您的代码无法读取。
我建议你把你的typedef改成这样:
typedef struct ensemble ensemble;
或者,更好的是,根本不用typedef。有这样的代码是非常好的:
#include <stdlib.h>
#include <stdio.h>
typedef unsigned int uint;
typedef unsigned long long int ullong;
struct ensemble {
ullong key;
uint index;
struct ensemble* left;
struct ensemble* right;
};
void ens_init(struct ensemble** node, ullong value, uint i) {
*node = calloc(1, sizeof(struct ensemble));
if (*node == NULL){
printf("Calloc errorn");
exit(-1);
}
(*node)->key = value;
(*node)->index = i;
(*node)->left = NULL;
(*node)->right = NULL;
}
int main(void) {
struct ensemble B;
struct ensemble* pointer_to_B;
pointer_to_B = &B;
ens_init(&pointer_to_B, 5, 1);
return 0;
}
为什么?因为它可以让你看到你的分配电话中有一个大问题。在ens_init()
中,分配一个足够大的内存区域来容纳struct ensemble
,然后将该区域的地址存储在指向结构的指针(而不是指向结构的指示器(中。您甚至没有在main()
函数中创建struct ensemble
类型的局部变量(我修复了这个问题(。你应该改为写这个(注意星号(:
void ens_init(struct ensemble** node, ullong value, uint i) {
// Asterisk added:
*node = calloc(1, sizeof(struct ensemble));
if (*node == NULL){
printf("Calloc errorn");
exit(-1);
}
(*node)->key = value;
(*node)->index = i;
(*node)->left = NULL;
(*node)->right = NULL;
}
奇怪的是,到处都有指向结构的指针。如果没有必要,你应该避免。