首页 > 解决方案 > 指针的结构指针上的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;
}

谢谢您的帮助 :)

标签: cstructsegmentation-faultcallocnfa

解决方案


您尝试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 ensemblemain()函数中创建类型的局部变量(我已修复)。你应该改写这个(注意星号):

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;
}

奇怪的是,你到处都有指向结构的指针。如果没有必要,您应该避免这种情况。


推荐阅读