模仿redis字典部分代码:dict.c
但是会报段错误,疑惑中
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct dictEntry {
int key;
} dictEntry;
typedef struct dictht {
dictEntry **table;
int d_val;
} dictht;
typedef struct dict {
dictht ht[2];
} dict;
dictEntry *dictAddRaw(dict *d, void *key)
{
dictEntry *entry;
entry = zmalloc(sizeof(*entry));
}
zmalloc 和malloc一样,
问题是一般分配内存都是
entry = zmalloc(sizeof(entry));
为什么redis
entry = zmalloc(sizeof(*entry));
ht->table=dict_entry; 这也不对啊,dict_entry的类型是dict_Entry*。
ht->table的类型是dict_Entry**。
而且,你也没有为ht分配内存,所以ht->table也不对。
所以,你首先需要为ht分配内存,dictht *ht = malloc(sizeof(dictht));
然后再ht->table = &dict_entry;。
或者,直接(ht->table) = malloc(sizeof(dict_entry)数组大小)
Edit:
你在那里用sizeof(entry)是不对的,可能你只是碰巧遇到sizeof(entry)的大小和sizeof(*entry)的大小相同。
因为sizeof(entry)得到的是指针的大小,sizeof(entry)得到的才是dictEntry的大小。用sizeof(entry)有一个好处就是当你修改entry的类型的时候,你不需要再去修改sizeof里面的东西。
例如:
TypeA ptr = malloc(sizeof(TypeA));如果要修改ptr为:TypeB ptr,那么就要连带修改sizeof(TypeA)为sizeof(TypeB)。如果用sizeof(*ptr),那么只需要修改把类型改为TypeB。
还有,为什么sizeof(*entry)是合法的?
Edit:
或者,直接(ht->table) = malloc(sizeof(dict_entry)数组大小)
抱歉,之前这里漏了,要先为ht->table分配内存先。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。