变量在声明之前使用是怎么回事?

how does it happened that a variable used before it's declared?

我对 redis 实现的文件 dict.c 中的函数 dictCreate() 感到困惑。我要在这里粘贴代码:

/* Create a new hash table 
 * T = O(1)
 */
dict *dictCreate(dictType *type, void *privDataPtr) {
    dict *d = zmalloc(sizeof(*d));
    _dictInit(d, type, privDataPtr);
    return d;
}

变量dzmalloc(sizeof(*d))中使用,但理论上在执行此行时它会存在。所以我的问题是如何在声明变量 d 之前使用变量?

sizeof 不是一个函数,它是一个运算符。它在编译时 executed(准确地说是评估),因此 scopelifetime 你正在考虑d,这里不适用。它需要知道的只是 *dtype 并且在编译时已知。够了。

声明

dict *d = zmalloc(sizeof(*d));  

等同于

dict *d;
d = zmalloc(sizeof(*d));  

因此,dict *dd 声明为指向 dict 类型的指针,并且 = zmalloc(sizeof(*d)); 用于初始化。 dict *d = zmalloc(sizeof(*d));d 声明为 dict *,然后在单行中对其进行初始化。

你的假设是错误的,对象从=开始初始化的标志开始存在。例如,在初始化程序中,您可以使用正在初始化的对象的地址。

这里,另外,不需要访问对象本身,sizeof只使用这种情况下的类型。