2015-08-05 5 views
6

Ich bin verwirrt über eine Funktion dictCreate() in Datei dict.c von redis Implementierung. Ich werde den Code hier einfügen:Wie ist es vorgekommen, dass eine Variable verwendet wurde, bevor sie deklariert wurde?

/* 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; 
} 

Variable d in zmalloc(sizeof(*d)) verwendet wird, aber theoretisch wird es existieren, wenn diese Zeile ausgeführt wurde. Also meine Frage ist, wie es möglich ist, Variable d zu verwenden, bevor es erklärt wird?

+0

'd' ist bereits deklariert: P. Sie können das sehen, wenn Sie die Deklaration zu "dict * d" umschreiben, was dasselbe bedeutet. –

+2

Es verwendet seinen Typ, nicht den Wert. Der Typ ist in der Kompilierzeit bekannt, also kein Problem. –

+0

Sehr nah an [Ist Dereferenzierung Nullzeiger gültig in Größe der Operation] (http://stackoverflow.com/q/19785518/1708801). –

Antwort

7

sizeof ist keine Funktion, es ist ein Operator. Es ist ausgeführt (ausgewertet, um genau zu sein) zur Kompilierzeit, so die Bereich oder Lebensdauer Sie denken über d, gilt hier nicht. Alles, was es wissen muss, ist der Typ von *d und das ist zur Kompilierzeit bekannt. Ausreichend.

+0

also weiß ich, dass 'sizeof' zur Kompilierzeit ausgeführt wird, und ich möchte etwas mehr über den' operator' erfahren, der in der Kompilierzeit ausgeführt wird. Danke! – ssj

+0

@whatout: Könnten Sie das näher erläutern? "Ich weiß, dass sizeof zur Kompilierzeit ausgeführt wird ..." widerspricht "eigentlich will ich etwas mehr über den Operator wissen ...".Entweder kennen Sie den _operator_ 'sizeof' oder Sie müssen mehr darüber wissen. Ich nehme an, Sie wissen, was "sizeof" tatsächlich tut, wie Sie es bereits verwenden. – Olaf

+0

@Olaf Ich möchte wissen, ob das ein anderer Operator ist, der zur Kompilierzeit ausgeführt wird? – ssj

1

Die Aussage

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

entspricht

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

So dict *d erklärt d als Zeiger auf dict Art und = zmalloc(sizeof(*d)); zur Initialisierung verwendet. dict *d = zmalloc(sizeof(*d)); deklariert d als dict * und initialisiert es dann in einer einzigen Zeile.

1

Ihre Annahme ist falsch, das Objekt existiert ab dem = Zeichen, das die Initialisierung startet. ZB in einem Initialisierer dürfen Sie die Adresse des Objekts, das Sie initialisieren, verwenden.

Hier wird zusätzlich kein Zugriff auf das Objekt benötigt, sizeof verwendet in diesem Fall nur den Typ.