Heim  >  Artikel  >  Backend-Entwicklung  >  Warum kann ich einem Nicht-Void-Zeiger in C kein „void*' zuweisen, in C jedoch?

Warum kann ich einem Nicht-Void-Zeiger in C kein „void*' zuweisen, in C jedoch?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-31 11:22:29291Durchsuche

  Why Can't I Assign a `void*` to a Non-Void Pointer in C  , But I Can in C?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn