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.

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

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

À 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 typedef 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