2009-01-30 2 views
14

Kann jemand erklären, was PVOID ist und wie es in einer Funktion wie verwendet wird:Was ist der PVOID-Datentyp?

BOOL DoSomething(PVOID pMemPhy) 
+0

Related Link: [Windows-Datentypen] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751 (v = VS.85) .aspx) – RAM

Antwort

19

void-Zeiger, gleich wie

void *pMemPhy 

aka „Zeiger auf etwas, aber es ist an Ihnen zu Figur es raus ".

BOOL DoSomething (PVOID pMemPhy) 
{ 
    strcpy((char *)pMemPhy, "I love buffer overflows!"); 
    return TRUE; 
} 
1

Es klingt wie es ist nur ein Alias ​​(define oder typedef) für void *. Ich habe keine Ahnung, warum die Leute denken, dass das besser wäre, aber ich weiß, dass einige APIs es gerne verwenden, falls sich die Implementierung eines Typs in Zukunft ändert.

Ich weiß, dass frühe Versionen von Windows Dinge wie STDCALL als Präfix für viele Funktionen verwendet und die Definition von STDCALL könnte sich ändern, basierend auf welcher Version von Windows, für die Sie kompiliert haben. Dies ist aus der Erinnerung (die nach vielen Jahren von Alkohol beeinflusst wird :-), also verlass dich nicht darauf als Evangelium. Es ist im Grunde korrekt, aber die Details könnten ein wenig anders sein.

4
typedef void * PVOID; 

Wenn Sie Frage ist, welche Verwendung ist ein Void-Zeiger? Am gebräuchlichsten ist es, wenn Sie einen Zeiger an Speicher übergeben, der den Typ nicht wirklich interessiert. frei(), zum Beispiel.

Wenn eine Bibliothek eine Funktion exportiert, die mehrere Zeigertypen verwenden kann, aber Sprachen wie C ohne Funktionsüberladung unterstützen möchte, funktioniert void *.

11

Es ist ein void Zeiger - ein Zeiger auf eine Speicheradresse ohne Informationen über den Typ des Werts, auf den es verweist. Aus diesem Grund müssen Sie den Zeiger auf einen Typ wie (char *)pMemPhy oder (int *)pMemPhy vor der Verwendung des Zeigers umwandeln, so dass der Compiler weiß, wie viel Speicher es arbeitet (1 Byte für ein Zeichen, 4 Byte für ein Int usw.)

+0

@ Jeremy Ruten, In diesem Fall, wenn es sich um eine physische Speicheradresse handelt, auf was soll ich es anwenden? –

+0

Es spielt keine Rolle, um welche Art von Speicheradresse es sich handelt (ich bin mir nicht sicher, was Sie mit "physischer Speicheradresse" meinen), Sie können es einfach auf den Typ anwenden, den Ihre Funktion behandeln soll. Es hängt davon ab, was die Funktion erreichen möchte, aber ich denke, die meiste Zeit würden Sie nach (char *) werfen. –

+0

Dies ist eigentlich eine API-Funktion. Laut Beschreibung öffnet diese Funktion einen Port auf einer Schnittstellenkarte. Da nicht viele Informationen verfügbar sind, weiß ich nicht, was ich vom Parameter "PVOID pMemPhy" halten soll. –

4

Wie andere gesagt haben, entspricht es void *.

void Zeiger werden oft in Speicheroperationen verwendet (memcpy, memset, etc ...), da man die Art der Daten an der angegebenen Adresse anzunehmen, nicht will.

Pointer und Void Pointer werden in this Artikel aus http://cplusplus.com eine gute Behandlung gegeben.

4

Diese und andere mnemonic wie BOOL, LPCTSTR haben ihren Ursprung mit Windows, das BTW wurde vor der Existenz eines C-Standards entwickelt, und um nicht in einem bestimmten Compiler zu hängen, verwendete es seine eigenen Typen.

Sie können den Old New Thing Blog für mehr Geschichten über die Windows-Entwicklungsgeschichte, und seine Kuriositäten, die bei uns bleiben (http://blogs.msdn.com/oldnewthing) überprüfen.

+1

https://blogs.msdn.microsoft.com/oldnewthing/20080325-00/?p=23013/ – Eugene