Komischer Cast!?
-
Einen wunderschönen Guten Morgen:)
Ich habe folgenden code:
void * new( const void * _class, const int argnr, ...) { const struct CLASS * class = _class; void * p = (void * )calloc(1, class -> size ); * (const struct CLASS **) p = class; //WAS PASSIERT HIER ;) ......... }
nun frage ich mich was die letzte zeile macht? da hat man einen pointer auf nen pointer und dereferenzioert ihn wieder????
Versteh das nich! Könnt ihr mir das erklären?
Grüße
-
p wird in einen Zeiger auf einen Zeiger auf eine Struktur vom Typ CLASS konvertiert. Dann wird dort, wohin dieser ZeigerZeiger zeigt, der Wert des CLASS-Zeigers "class" kopiert.
-
und was bewirkt das?
-
Dass der Wert, auf den p zeigt, sich ändert? Hat Z doch gerade beschrieben?!
-
MarkoNoob schrieb:
und was bewirkt das?
Dann steht dort wo p hinzeigt der Wert des Zeigers class.
Aber ich bin mir nicht so sicher, ob das so gewollt ist. Für mich sieht das eher so aus, als sollte da der Wert von *class hingeschrieben werden. Aber ich bin auch nicht so bewandert in der Nachmache von C++ mit den Mitteln von C und nehme lieber gleich C++. Falls du das aus einem getesteten Programm hast, ist es vermutlich doch gewollt. Vielleicht passiert das was mir fehlt auch noch in dem ...... -Teil.
-
Das bewirkt das die Structur class vom Stack in den zuvor allokierten Speicher aufn Heap kopiert wird.(Edit: äh stimmt der Zeiger darauf )
-
ScottZhang schrieb:
Das bewirkt das die Structur class vom Stack in den zuvor allokierten Speicher aufn Heap kopiert wird.(Edit: äh stimmt der Zeiger darauf )
class ist hier aber nur ein Zeiger auf die Struktur.
-
Ja das is gewollt!! siehe http://www.mathematik.uni-ulm.de/sai/ws96/seminar/neher/node9.html#SECTION00042100000000000000
Ja ich glaube auch, dass damit eine kopie der übergeben strucktur in dne allokierten heap soll
aber hätte man das nich so gemacht ?
memcpy(p,class,sizeof(CLASS));
-
Oder eben eine Ebene tiefer, also
* (const struct CLASS *) p = *class;
-
achso, das muss so.
ein Zeiger class kommt immer als erstes in die Struktur. Das definiert sozusagen die Klasse (oder die Baisklasse).
Darum schreibt er auch
struct CLASS_xyz { void * class; /* unbedingt zuerst */ .... (Daten) };
Die eigetnliche Initialisierung kommt später, mithilfe dieses CLASS Zeigers.
-
Ja das versteh ich schon.. aber ich ich versteh nich warum mit der anweisung die struktur "kopiert" wird.. hmm. .vll. fehlt mir noch die tiefere pointer denkweise...