c - 指针的结构指针上的Calloc错误
问题描述
我的 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
我认为你在隐藏类型是指向 a 的指针这一事实是错误的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()
函数中创建类型的局部变量(我已修复)。你应该改写这个(注意星号):
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;
}
奇怪的是,你到处都有指向结构的指针。如果没有必要,您应该避免这种情况。
推荐阅读
- python - 如何在 Jupyter Notebook 中将字符串格式化程序与 og2ogr 一起使用?
- django - 如何为 django-modeltranslation 过滤帖子
- sqlite - 为什么 Sqlite CREATE QUESTION 函数不起作用?
- vba - 与 ChromeDriver 和 MSXML2.ServerXMLHTTP (VBA) 交互时发送自定义用户数据目录
- ios - 当内部发布者使用 subscribe(on:) 时,CombineLatest 运算符不会发出
- jquery - Jquery 使用 .hide() 隐藏 div 但仅当 div 具有 .open 时?
- ios - UserDefaults 的问题(套件名称:)
- ios - Apple 的 SwiftUI 教程代码在自制副本中不显示视图内容
- python - Selenium Python - 在深度嵌套的 HTML 元素中找不到正确的 CSS 或 Xpath
- rust - 是否可以在编译时编写包含宏收集数据的文件?