Void-Zeiger in Integer-Array umwandeln

Lesezeit: 3 Minuten

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.

  • Wie erhalten Sie zunächst die Adresse in ptr? Es könnte gefährlich sein, einen willkürlichen Zeiger darauf zu setzen unsigned int * wenn der Anfangszeiger nicht ausgerichtet war sizeof 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

Benutzer-Avatar
nhahtdh

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;

  • danke ja das ist was ich brauche. Könnten Sie näher erläutern, wie der Zeiger gecastet wird?

    – Konor

    12. Juli 2012 um 14:51 Uhr

  • Gießen Sie es einfach normal, dh unsigned int (*array)[150] = (unsigned int (*)[150]) ptr;

    – nhahtdh

    12. Juli 2012 um 14:54 Uhr

  • @nhahtdh: Ich habe das versucht:(unsigned long)result.c[2] = 126und ich habe diesen Compiler-Fehler lvalue als linker Operand der Zuweisung erforderlich.resultist eine Struktur und cist vom Typ unsigned short *.

    – Benutzer2284570

    16. Juni 2014 um 23:43 Uhr


  • @ user2284570: Was versuchst du zu tun? Soweit ich sehe, ist es für die Frage hier irrelevant. Aber was Sie wahrscheinlich wollen, ist ((unsigned long*) result.c)[2] = 126

    – nhahtdh

    17. Juni 2014 um 6:45 Uhr

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 typedefs 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

1334720cookie-checkVoid-Zeiger in Integer-Array umwandeln

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy