我正在编写一本结构如下的字典:
typedef union _dict {
union _dict * children[M];
list * words[M];
} dict;
初始化:
dict *d = (dict*) malloc(sizeof(dict));
我正在尝试执行以下操作:
dict *temp;
temp = d;
temp=temp->children[0];
temp=temp->children[0];
第一个 temp->children[0]
有效,但第二个无效。我试图理解为什么。我认为这是一个内存分配问题。
编辑 1: 我试过以下代码:
dict *d = (dict*) malloc(sizeof(dict));
dict *temp;
temp = d;
dict *d2 = (dict*) malloc(sizeof(dict));
temp->children[0] = d2;
temp = temp->children[0];
temp = temp->children[0];
temp = temp->children[0];
现在可以了,但我不明白为什么......我的意思是,我不允许下一个 child 有一些内存。
编辑 2: 所以现在,我想在我的算法中使用它。我卡住的代码块如下:
list *l;
if (temp->words[occur] != NULL) {
/* ... */
}
else {
l = list_new();
temp->words[occur] = (list*) malloc(sizeof(list));
temp->words[occur] = l;
}
list_append(l,w);
list_print(l);
如果我在这个 block 之前放一个 temp->words[occur] = NULL;
,这个词就成功添加了,但是每次使用算法时都会创建一个新列表。我想将我的单词添加到先前创建的列表中,假设它存在。
bzero((void*)d, sizeof(dict));
指令在 dict 初始化后使用。
最佳答案
首先,在 temp
中,您有一个指向对象的有效指针(使用 malloc 分配)。然后您将一个未初始化的指针分配给 temp
并尝试以预期的结果取消引用它。
关于c - 具有多维数组的 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8231969/