Heim > Artikel > Backend-Entwicklung > Warum kann ich einem Nicht-Void-Zeiger in C kein „void*“ zuweisen, in C jedoch?
Void-Zeiger: Die Kluft zwischen C und C aufdecken
Wenn es um Void-Zeiger geht, zeigen C und C unterschiedliche Verhaltensweisen. Das Problem dreht sich um die Zulässigkeit der Zuweisung von void*-Rückgabewerten an Nicht-Void-Zeiger.
In C sind solche Zuweisungen zulässig, wie der folgende Code zeigt, der sich fehlerfrei kompilieren lässt:
<code class="c">int* p = malloc(sizeof(int));</code>
In C lässt sich derselbe Code jedoch nicht kompilieren, was auf die strengere Typprüfung in C hinweist. Diese Diskrepanz ergibt sich aus der unterschiedlichen Handhabung von Void-Zeigern.
Während C implizite Konvertierungen zwischen void und jedem anderen Zeigertyp zulässt, schränkt C diese Freiheit ein. In C erfordern Konvertierungen von void in einen bestimmten Zeigertyp eine explizite Umwandlung. Daher ist eine Umwandlung erforderlich, damit der folgende Code in C kompiliert werden kann:
<code class="c++">int* p = (int*) malloc(sizeof(int));</code>
Trotz dieses Unterschieds erlaubt C implizite Konvertierungen von Nicht-Void-Zeigern in void*. Diese Funktion wird im folgenden Code deutlich:
<code class="cpp">void foo(void* vptr) { } int main() { int* p = (int*) malloc(sizeof(int)); foo(p); return 0; }</code>
Dieser Code lässt sich sowohl in C als auch in C ohne Probleme kompilieren. Der Grund liegt in der inhärenten Flexibilität von void und der Natur von Zeigern. Jeder Objektzeiger kann sicher in void konvertiert werden, ohne dass Informationen verloren gehen. Wenn void* wieder in seinen ursprünglichen Zeigertyp konvertiert wird, wird der genaue Zeiger wiederhergestellt. Dies wird durch das Zitat von K&R2 veranschaulicht:
"Jeder Zeiger auf ein Objekt kann ohne Informationsverlust in den Typ void * konvertiert werden. Wenn das Ergebnis wieder in den ursprünglichen Zeigertyp konvertiert wird, wird der ursprüngliche Zeiger wiederhergestellt ."
Das obige ist der detaillierte Inhalt vonWarum kann ich einem Nicht-Void-Zeiger in C kein „void*“ zuweisen, in C jedoch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!