c - 递归结构和 malloc()

标签 c struct malloc recursive-datastructures

我有一个递归的 struct 是:

typedef struct dict dict;
struct dict {
    dict *children[M];
    list *words[M];
};

这样初始化:

dict *d = malloc(sizeof(dict));
bzero(d, sizeof(dict));

我想知道 bzero() 在这里到底做了什么,以及我如何为 child 递归地 malloc()

编辑:这就是我希望能够malloc() childrenwords 的方式:

void dict_insert(dict *d, char *signature, unsigned int current_letter, char *w) {
    int occur;
    occur = (int) signature[current_letter];
    if (current_letter == LAST_LETTER) {
        printf("word found : %s!\n",w);
        list_print(d->words[occur]);
        char *new;
        new = malloc(strlen(w) + 1);
        strcpy(new, w);
        list_append(d->words[occur],new);
        list_print(d->words[occur]);
    }
    else {
        d = d->children[occur];
        dict_insert(d,signature,current_letter+1,w);
    }
}

最佳答案

bzero(3)将内存初始化为零。相当于调用memset(3)第二个参数为 0。在这种情况下,它将所有成员变量初始化为空指针。 bzero 被认为已弃用,因此您应该将其替换为 memset;或者,您可以直接调用 calloc(3)而不是 malloc,它会在成功时自动为您清零返回的内存。

您不应该使用您编写的两种类型转换中的任何一种——在 C 中,void* 指针可以隐式转换为任何其他指针类型,并且任何指针类型都可以隐式转换为 无效*malloc 返回一个 void*,因此您可以将它分配给您的 dict *d 变量而无需强制转换。类似地,bzero 的第一个参数是 void*,因此您可以直接将 d 变量传递给它而无需强制转换。

要理解递归,首先要理解递归。如果您想避免无限分配内存,请确保您有合适的基本情况。

关于c - 递归结构和 malloc(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8287809/

相关文章:

c - 如何将 "zd"说明符与 `printf()` 一起使用?

c++ - 与主线程相比,辅助线程崩溃是否有优势?

c - 链接外部静态结构数组无法正常工作

c++ - 序列化结构的 STL 映射

c - 使基于数组的程序在没有元素的情况下工作

c - malloc 不转换为结构

c - 是否可以从 C 访问程序集中定义的变量?

c - pthread 指针数组

c - 使用 typedef 结构从不兼容的指针类型赋值

c - 使用 malloc.c 的堆分配内存边界