void* adresse ohne warnung ändern möglich?
-
Hallo,
als Fortsetzung von hier
http://www.c-plusplus.net/forum/p2419070#2419070void* adresse; // hat einen wert
int offset ; // hat einen wertspäter dann irgendwo so verwendet
adresse + offset
kompiliert man mit
-Wall -Wextra -pedantic
gibt es diese Warnung:
warning: pointer of type 'void *' used in arithmeticmuss ich -pedantic weglassen um die Warnung weg zu bekommen oder gibt es einen anderen weg?
-
Du musst casten:
adresse = (char *)adresse + offset;
-
Laut Arithmetic on void- and Function-Pointers kann der GCC void pointer Aritmetik erlauben, unter der Annahme "sizeof(void) == 1".
adresse = adresse + offset; // vom standard verboten, GCC kompiliert dank der Erweiterung adresse = (char*)adresse + offset; // erlaubt
Ein Cast auf char* sollte das Problem lösen.
-
in der Tat,
char* funktioniert, und das Ergebnis passt, im gegensatz zu meinem Original (int*) auch.
vielen Dank!jetzt interessiert mich aber,
void* foo;
ist
(int*) foo + 1
etwas anderes als
(char*) foo + 1ist (int*) foo + 1 so wie (char*) foo + 4
?
-
Klar ist das was anderes!
Das Ergebnis ist von der Größe eines int (sizeof(int)) abhängig, also nicht pauschal vorherzusagen.
-
Belli schrieb:
Klar ist das was anderes!
Das Stichwort, dass dem Fragesteller anscheinend unbekannt ist, lautet Pointerarithmetik. Ist eine wichtige Eigenschaft der Sprache C, weswegen es für Belli klar ist, für Neulinge aber vielleicht etwas überraschend.
-
Als Ergänzung:
sizeof(char)
ist 1. Immer. Es können auch mehr als 8 Bit sein.
Die anderen Größen sind Systemabhängig. D.h.sizeof(int)
muss nicht 4 sein.Der C-Standard legt nur Mindestwertebereiche fest. Für
int
liegt die bei -32767 bis 32767. (Das passt in 16 Bit)
Die reale Implementierung kann auch größer sein.http://stackoverflow.com/questions/2098149/what-platforms-have-something-other-than-8-bit-char
-
danke für die Hilfe!
da werde ich einiges nachlesen müssen,