将void指针转换为整数数组

时间:2012-07-12 14:44:02

标签: c memory casting

我有一个问题,我有一个指向内存区域的指针。我想用这个指针创建一个整数数组。

基本上这就是我所拥有的,指向大小为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 ];

我假设它涉及一些演员虽然我不确定如何制定它。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:18)

您可以将指针强制转换为unsigned int (*)[150]。然后可以使用它就好像它是一个2D数组(“好像”,因为sizeof的行为不同)。

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

答案 1 :(得分:1)

从您的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