Ich habe ein Problem, bei dem ich einen Zeiger auf einen Bereich im Speicher habe. Ich möchte diesen Zeiger verwenden, um ein Integer-Array zu erstellen.
Im Wesentlichen habe ich das, einen Zeiger auf eine Speicheradresse der Größe 100 * 300 * 2 = 60000 Bytes
unsigned char *ptr = 0x00000000; // fictional point in memory goes up to 0x0000EA60
Was ich erreichen möchte, ist, diesen Speicher als ein ganzzahliges Array der Größe 100 * 150 = 15000 Ints = 60000 Bytes zu untersuchen, wie folgt:
unsigned int array[ 100 ][ 150 ];
Ich gehe davon aus, dass es etwas Casting beinhaltet, obwohl ich nicht genau weiß, wie ich es formulieren soll. Jede Hilfe wäre willkommen.
Sie können den Zeiger auf umwandeln unsigned int (*)[150]
. Es kann dann verwendet werden als ob es ist ein 2D-Array (“als ob”, da das Verhalten von sizeof
ist anders).
unsigned int (*array)[150] = (unsigned int (*)[150]) ptr;
Beginnend mit Ihrer ptr-Deklaration
unsigned char *ptr = 0x00000000; // fictional point in memory goes up to 0x0000EA60
Sie können ptr in einen Zeiger auf den Typ umwandeln, als den Sie den Block behandeln, in diesem Fall Array of Array of unsigned int. Wir deklarieren einen neuen Zeiger:
unsigned int (*array_2d)[100][150] = (unsigned int (*)[100][150])ptr;
Greifen Sie dann auf Elemente zu, indem Sie sie dereferenzieren und dann indizieren, so wie Sie es bei einem normalen 2D-Array tun würden.
(*array_2d)[50][73] = 27;
Etwas typedef
s würden auch beim Aufräumen helfen.
typedef unsigned int my_2d_array_t[100][150];
typedef my_2d_array_t *my_2d_array_ptr_t;
my_2d_array_ptr_t array_2d = (my_2d_array_ptr_t)ptr;
(*array_2d)[26][3] = 357;
...
Und sizeof
sollte richtig funktionieren.
sizeof(array_2d); //4, given 32-bit pointer
sizeof(*array_2d); //60000, given 32-bit ints
sizeof((*array_2d)[0]); //600, size of array of 150 ints
sizeof((*array_2d)[0][1]); //4, size of 1 int
Wie erhalten Sie zunächst die Adresse in
ptr
? Es könnte gefährlich sein, einen willkürlichen Zeiger darauf zu setzenunsigned int *
wenn der Anfangszeiger nicht ausgerichtet warsizeof int
. In diesem Fall sind Ihre Zugriffe auf den Speicher bestenfalls langsam, da Lesevorgänge über Cache-Zeilen hinweg ausgeführt werden. Im schlimmsten Fall könnte es einen Busfehler verursachen und Ihr Programm wird angehalten (abhängig von Ihrer CPU-Architektur).– Chris Reis
13. Juli 2012 um 2:05 Uhr
Hallo Chris, habe gerade deinen Kommentar gesehen. em ist die Adresse tatsächlich ähnlich der im Beispiel und ich erhalte sie nicht von irgendwoher – es ist ein Bereich im Speicher, von dem ich weiß, dass er frei ist – und in einer eingebetteten Umgebung arbeitet. Ich kann jedoch sehen, was Sie meinen, da dies einen Fehler verursachte, als ich es auf ein Zeichen ausgerichtet hatte und dann versuchte, es in int umzuwandeln. Die (vorübergehende) Lösung, die ich verwende, besteht darin, die Adresse wie oben erneut manuell einzugeben
– Konor
18. Juli 2012 um 20:29 Uhr