我的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 error\n");
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_ajouter()
在调用初始化函数之前先调用该函数ens_init()
。这意味着calloc()
永远不会从main()
函数中调用该函数。
我认为你犯了一个错误,以隐瞒事实,类型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 error\n");
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()
,你分配了一个足以容纳a的内存区域struct ensemble
,然后将该区域的地址存储在指向结构的指针(而不是指向结构的指针)的指针中。而且你甚至都没有struct ensemble
在main()
函数中创建类型的局部变量(我已修复了该问题)。你应该改写以下代码(注意 Asterisk ):
void ens_init(struct ensemble** node, ullong value, uint i) {
// Asterisk added:
*node = calloc(1, sizeof(struct ensemble));
if (*node == NULL){
printf("Calloc error\n");
exit(-1);
}
(*node)->key = value;
(*node)->index = i;
(*node)->left = NULL;
(*node)->right = NULL;
}
奇怪的是,你到处都有指向结构的指针。如果没有必要,则应避免这种情况。
它正在工作,非常感谢:)