Подтвердить что ты не робот

Приведение указателя void в целочисленный массив

У меня есть проблема, когда у меня есть указатель на область в памяти. Я хотел бы использовать этот указатель для создания целочисленного массива.

По существу это то, что у меня есть, указатель на адрес памяти размером 100 * 300 * 2 = 60000 байт

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

То, что я хотел бы получить, - это проверить эту память как целочисленный массив размером 100 * 150 = 15000 ints = 60000 байт, например:

unsigned int array[ 100 ][ 150 ];

Я предполагаю, что это связано с кастингом, хотя я точно не знаю, как его сформулировать. Любая помощь будет оценена.

4b9b3361

Ответ 1

Вы можете направить указатель на unsigned int (*)[150]. Затем он может быть использован , как если бы это 2D-массив ( "как будто", поскольку поведение sizeof отличается).

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

Ответ 2

Начиная с вашего объявления ptr

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

Вы можете направить ptr на указатель на любой тип, который вы обрабатываете как блок, в этом случае массив массива unsigned int. Мы объявим новый указатель:

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

Затем создайте элементы доступа путем разыменования и затем индексирования так же, как и для обычного 2d-массива.

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

Некоторые typedef также помогут очистить вещи.

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

И sizeof должен работать правильно.

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