指针的结构指针上的 Calloc 错误
Calloc error on struct pointer of pointer
我的 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_init()
之前调用函数 ens_ajouter()
。这意味着函数 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()
中,您分配了一个足够大的内存区域来容纳 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 error\n");
exit(-1);
}
(*node)->key = value;
(*node)->index = i;
(*node)->left = NULL;
(*node)->right = NULL;
}
我很奇怪你到处都有指向结构的指针。如果没有必要,你应该避免这种情况。
我的 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_init()
之前调用函数 ens_ajouter()
。这意味着函数 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()
中,您分配了一个足够大的内存区域来容纳 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 error\n");
exit(-1);
}
(*node)->key = value;
(*node)->index = i;
(*node)->left = NULL;
(*node)->right = NULL;
}
我很奇怪你到处都有指向结构的指针。如果没有必要,你应该避免这种情况。