开发者社区> 问答> 正文

模仿redis字典部分代码:dict.c 疑惑中

模仿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));

展开
收起
a123456678 2016-06-06 14:08:04 1979 0
1 条回答
写回答
取消 提交回答
  • 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分配内存先。

    2019-07-17 19:28:31
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
ApsaraDB for Redis——与创客同行 立即下载
微博的Redis定制之路 立即下载
云数据库Redis版的开源之路 立即下载