KINGx - Das inoffizielle PlayStation Forum & News Portal

Normale Version: [C] Was bedeutet "((int *) blablabla)[123]"
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
ich interessiere mich ein bischen für den neuen action replay.
deshalb habe ich ihn mal decompiliert.

das komische ist es kommt ganz oft sowas vor:
((int *) sp)[1] = ra;
((int *) sp)[0] = s0;
(int *) sp)[7] = ra;
((int *) sp)[6] = s6;
((int *) sp)[5] = s5;
((int *) sp)[3] = s3;
((int *) sp)[2] = s2;
ich bin jetzt nicht so der Pro aber ist das ein fehler vom decompiler oder was macht das. und wieso heißen die variablen so wie die cpu register?

EDIT: ich hab mal nachgedacht. sind das zeiger arrays oder was?
Hi,

also ich gehe mal davon aus, dass der decompiler funktioniert.

Das was du da siehst sind sogenannte "Type casts" und anshcließende addressierungen.
Also nehmen wir mal deinen Betreff als beispiel
((int*)blabla)[123]...

Dabei ist blabla ein Zeiger auf eine Speicher addresse.
Um jetzt z.Bsp. auf das n-te Element an dieser Speicheradresse zugreifen zu können muss der compiler/das programm wissen wie groß ein Element ist - also wieviel byte es belegt.
Über (int*)blabla wird ein type cast gemacht. Das bedeutet hier sind die Daten auf die der zeiger im speicher zeigt als int abgelegt sein. Ein int ist 32 Bit (4 byte lang). Damit weiß nun das system um wieviele einheiten die Addresse erhöht werden muss um auf das nächste Element zuzugreifen.

die Zahl in den eckigen klammern [123] sagt welches element gemeint ist. Im Grunde lässt sich sagen, dass mit ((int *)blabla)[123] der 123. integer Wert an der Addresse blabla im Speicher gesetzt bzw. gelesen werden soll.

Ich hoffe das hilft weiter Wink

Nochmal für eine zeile in deinem thread:

PHP-Code:
((int *) sp)[1] = ra

bedeutet, dass sp ein zeiger auf integer daten sein soll und dass das 2. Element mit dem wert der in der variablen ra steht gefüllt wird.
es ist das 2. element, da in C/c++ immer bei der addressierung mit 0 angefangen wird zu zählen. also zeiger[0] ist das erste element.

anmabagima :
Nochmal für eine zeile in deinem thread:

PHP-Code:
((int *) sp)[1] = ra

bedeutet, dass sp ein zeiger auf integer daten sein soll und dass das 2. Element mit dem wert der in der variablen ra steht gefüllt wird.
es ist das 2. element, da in C/c++ immer bei der addressierung mit 0 angefangen wird zu zählen. also zeiger[0] ist das erste element.


wird auf zweite element von sp dann nicht der zeiger auf die variable ra gespeichert? wegen dem int*. außerdem ist ra schon int das müsste man gar nicht mehr casten.

Hi,

im zweiten Element von rp wird der Wert von ra gespeichert - nicht der Zeiger auf ra.
Ein type cast des zeigers rp ist notwendig, da ansonsten die indexangabe des elementes mit [1] nicht auf die richtige adresse im speicherbreich zeigen würde. Meistens sind Zeiger vom typ void* - also beliebieger untypisierter Zeiger. Das hat den Vorteil dass man diese Art Zeiger überall hin übergeben kann ohne compiler fehler...

Wie auch immer. Nehmen wir an dass rp = 0x00. Also ein Zeiger ist der auf die Adress 00 (hex) zeigt. da ein int 32 bit hat (4 byte) würde
((int*)rp)[1] also auf die adresse 0x04 zeigen. Dort steht ein int wert der dann gesetzt wird - also werden von ra genau 4 bytes übertragen. Wäre das nicht so, würden Elemente der Liste überschrieben die nicht überschrieben werden sollen...

wäre der type cast auf char dann würde ((char*)rp)[1] auf die adresse 0x01 zeigen. dort einen int wert reinzuschreiben würde sowohl den inhalt vom eigentlich 1. Element als auch den des 2. elements unbrauchbar machen... Darum ist der Typecast beim Zeiger wichtig und unabhängig von dem zugewiesenen wert, da du ja auch ein short oder char in die Adresse ((int*)sp)[1] shreiben könntest. z.Bsp. ((int*)sp)[1] = (short)var1;
Referenz-URLs