Estoy confundido acerca de una función dictCreate() en el archivo dict.c de la implementación de redis . Voy a pegar el código aquí:
/* 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; } la variable d se usa en zmalloc(sizeof(*d)) , pero teóricamente existirá cuando se ejecute esta línea. Entonces, mi pregunta es ¿cómo es posible usar la variable d antes de que se declare?
sizeof no es una función, es un operador. Se ejecuta (evalúa, para ser exactos) en el momento de la compilación, por lo que el alcance o la duración en la que está pensando d , no se aplica aquí. Todo lo que necesita saber es el tipo de *d y eso se conoce en tiempo de compilación. Suficiente.
La declaración
dict *d = zmalloc(sizeof(*d));es equivalente a
dict *d; d = zmalloc(sizeof(*d)); Entonces, dict *d declara d como un puntero al tipo de dictado y = dict = zmalloc(sizeof(*d)); utilizado para la inicialización. dict *d = zmalloc(sizeof(*d)); declara d como dict * y luego lo inicializa en una sola línea.
Su suposición es incorrecta, el objeto existe a partir del signo = que inicia la inicialización. Por ejemplo, en un inicializador, puede usar la dirección del objeto que está inicializando.
Aquí, además, no se necesita acceso al objeto en sí, sizeof solo usa el tipo en este caso.