web-dev-qa-db-fra.com

Convertir le pointeur vide sur un tableau entier

J'ai un problème où j'ai un pointeur sur une zone en mémoire. Je voudrais utiliser ce pointeur pour créer un tableau entier.

C'est essentiellement ce que j'ai, un pointeur sur une adresse mémoire de taille 100 * 300 * 2 = 60000 octets

unsigned char *ptr = 0x00000000; // fictional point in memory goes up to 0x0000EA60

Ce que je voudrais réaliser est d’examiner cette mémoire sous la forme d’un tableau entier de taille 100 * 150 = 15000 ints = 60000 octets, comme ceci:

unsigned int array[ 100 ][ 150 ];

Je suppose que cela implique un casting mais je ne suis pas sûr de savoir comment le formuler. Toute aide serait appréciée.

20
conor

Vous pouvez convertir le pointeur en unsigned int (*)[150]. Il peut ensuite être utilisé comme si il s’agit d’un tableau 2D ("comme si", puisque le comportement de sizeof est différent).

unsigned int (*array)[150] = (unsigned int (*)[150]) ptr;
18
nhahtdh

À partir de votre déclaration ptr

unsigned char *ptr = 0x00000000; // fictional point in memory goes up to 0x0000EA60

Vous pouvez convertir ptr en un pointeur sur le type que vous considérez comme le bloc, dans ce cas, un tableau de tableau de unsigned int. Nous allons déclarer un nouveau pointeur:

unsigned int (*array_2d)[100][150] = (unsigned int (*)[100][150])ptr;

Ensuite, accédez aux éléments en déréférencant puis en indexant comme vous le feriez pour un tableau 2D normal.

(*array_2d)[50][73] = 27;

Certains typedefs aideraient également à nettoyer les choses.

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;
...

Et sizeof devrait fonctionner correctement.

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
1
podom