Warm tip: This article is reproduced from serverfault.com, please click

c-指针的结构指针上的Calloc错误

(c - Calloc error on struct pointer of pointer)

发布于 2020-12-04 23:20:54

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

谢谢你的帮助 :)

Questioner
Baptiste Leroux
Viewed
0
RalphS 2020-12-05 08:49:08

你尝试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 ensemblemain()函数中创建类型的局部变量(我已修复了该问题)。你应该改写以下代码(注意 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;
}

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