2016-10-03 5 views
-3

Erstens bitte verzeihen Sie meine begrenzten c wissen, aber wie kann ich einen char-Zeiger in eine lange auf 32bit und 64bit-Plattformen? Dieser Code gibt mir eine Compiler-Warnung C4311 mit Visual Studio 2015Cast char Zeiger zu lang

char *c; 
long l; 
l = (long)(c); 

Dank

bearbeiten

Fehlercode ist 'type cast': Zeiger Abschneiden von 'char *' auf 'long' Kann ich mit Downvotes wissen, warum sie runtergeregelt haben?

+2

Warum denkst du, es ist vernünftig ** nicht ** die Warnmeldung ??!? – Amit

+0

Was ist die Warnmeldung? Es gibt viele Compiler-Warnungen, wie können wir möglicherweise wissen, auf welchen Sie _you_ gestoßen sind? –

+1

Was versuchen Sie damit zu erreichen? – ZenJ

Antwort

4

Tun Sie das nicht, wenn Sie es vermeiden können.

C99 (und neuer) unterstützt einen Typ namens uintptr_t. Es ist ein ganzzahliger Typ, der einen Zeigerwert halten kann. Weitere Informationen finden Sie unter stddef.h.

Visual Studio unterstützt C99 nicht vollständig. Daher könnte es sein, dass du es nicht zur Arbeit bekommst, aber es ist einen Versuch wert.

char* c = <some value>; 
uintptr_t ptr = (uintptr_t)c; 

Wenn Sie die C-Quelldatei als C++ Quelle kompilieren, (mit /TC Compiler-Option), sollten Sie in der Lage sein, das zu verwenden.

1

Welchen Zweck hat es, einen Zeiger auf eine Ganzzahl zu setzen? Sie können eine Union oder eine Struktur oder möglicherweise ein void * verwenden.

Microsoft Compilierungsumgebungen standardmäßig zu LLP64, wo eine lange 32 Bit breit ist, und das kann zu schmal sein, wenn Ihre Zeiger 64 Bit breit sind. ->https://msdn.microsoft.com/en-us/library/cc953fe1.aspx

+1

Ich glaube Routine berechnet ein Speichersegment, da es seine eigene Stack-Handhabung macht, also ist die Verwendung von intptr_t oder uintptr_t eine Lösung? –

+0

simon-p-r, in dieser Situation gibt es auch die Datentypen size_t und ptrdiff_t, aber ich behaupte, dass das Speichern von Zeigern in Ganzzahlen missbräuchlich ist und Code schlecht lesbar macht. Meine Empfehlungen stehen. – user602469

+0

Ok, ich danke Ihnen für Ihre Kommentare –