Heim Backend-Entwicklung C++ 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?

Oct 31, 2024 am 11:22 AM

  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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Erklärung dieser Website
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

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

C Sprachfunktionsformat -Buchstaben -Fall -Konvertierungsschritte C Sprachfunktionsformat -Buchstaben -Fall -Konvertierungsschritte Mar 03, 2025 pm 05:53 PM

C Sprachfunktionsformat -Buchstaben -Fall -Konvertierungsschritte

Welche Werte sind von C -Sprachfunktionen zurückgegeben? Was bestimmt den Rückgabewert? Welche Werte sind von C -Sprachfunktionen zurückgegeben? Was bestimmt den Rückgabewert? Mar 03, 2025 pm 05:52 PM

Welche Werte sind von C -Sprachfunktionen zurückgegeben? Was bestimmt den Rückgabewert?

GULC: C -Bibliothek von Grund auf neu gebaut GULC: C -Bibliothek von Grund auf neu gebaut Mar 03, 2025 pm 05:46 PM

GULC: C -Bibliothek von Grund auf neu gebaut

Was sind die Definitionen und Aufrufregeln von C -Sprachfunktionen und was sind die? Was sind die Definitionen und Aufrufregeln von C -Sprachfunktionen und was sind die? Mar 03, 2025 pm 05:53 PM

Was sind die Definitionen und Aufrufregeln von C -Sprachfunktionen und was sind die?

Wie funktioniert die C -Standard -Vorlagenbibliothek (STL)? Wie funktioniert die C -Standard -Vorlagenbibliothek (STL)? Mar 12, 2025 pm 04:50 PM

Wie funktioniert die C -Standard -Vorlagenbibliothek (STL)?

eindeutiger Gebrauch und Phrasenfreigabe eindeutiger Gebrauch und Phrasenfreigabe Mar 03, 2025 pm 05:51 PM

eindeutiger Gebrauch und Phrasenfreigabe

Wo ist der Rückgabewert der C -Sprachfunktion im Speicher? Wo ist der Rückgabewert der C -Sprachfunktion im Speicher? Mar 03, 2025 pm 05:51 PM

Wo ist der Rückgabewert der C -Sprachfunktion im Speicher?

Wie benutze ich Algorithmen aus der STL (sortieren, finden, transformieren usw.) effizient? Wie benutze ich Algorithmen aus der STL (sortieren, finden, transformieren usw.) effizient? Mar 12, 2025 pm 04:52 PM

Wie benutze ich Algorithmen aus der STL (sortieren, finden, transformieren usw.) effizient?

See all articles