Ответ 1
Вы можете направить указатель на unsigned int (*)[150]
. Затем он может быть использован , как если бы это 2D-массив ( "как будто", поскольку поведение sizeof
отличается).
unsigned int (*array)[150] = (unsigned int (*)[150]) ptr;
У меня есть проблема, когда у меня есть указатель на область в памяти. Я хотел бы использовать этот указатель для создания целочисленного массива.
По существу это то, что у меня есть, указатель на адрес памяти размером 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 ];
Я предполагаю, что это связано с кастингом, хотя я точно не знаю, как его сформулировать. Любая помощь будет оценена.
Вы можете направить указатель на unsigned int (*)[150]
. Затем он может быть использован , как если бы это 2D-массив ( "как будто", поскольку поведение sizeof
отличается).
unsigned int (*array)[150] = (unsigned int (*)[150]) ptr;
Начиная с вашего объявления 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