考虑定义如下的帧缓冲区数组:
static uint8_t framebuffer[num_buffers][1024];
数组被定义为每个显示缓冲区只有一个维度,因为底层硬件外围设备在我的嵌入式应用程序中需要它。然而,在代码的其他区域,通过额外的维度来处理相同的帧缓冲区将是非常有利的,例如:
framebuffer[buf][page][col];
我该如何实现?使用实数,我希望 page 的范围为 0 到 7,col 为 0 到 127。注意:每页为 128 字节。例如,此语句的计算结果为真,因为它们将引用相同的字节:
framebuffer[0][130] == framebuffer[0][1][2]
因为 130/128 = 1(页面)和 130 % 128 = 2(列)。我假设我需要使用 malloc,但我未能成功生成正确的行为。
最佳答案
“维度”不是分配内存的属性,而是数据类型。您可以通过具有不同维度的不同类型的指针访问同一内存,前提是您要注意确保整体大小和对齐方式兼容。所以对于你的例子,你可以这样做:
static uint8_t framebuffer[numbuffers][1024];
uint8_t (*redimensioned)[8][128] = (uint8_t (*)[8][128])framebuffer;
..然后,例如,将第二个缓冲区的第 3 页的第 4 列归零:
redimensioned[1][2][3] = 0;
详细一点,原始声明uint8_t framebuffer[numbuffers][1024];
声明一个数组数组( numbuffers
数组 1024
uint8_t
的)。它会衰减为指向 1024
数组的指针。 uint8_t
的(或 uint8_t (*)[1024]
,也可以作为 N x 1024
二维数组访问。
我们还可以通过指向 8
数组的指针访问原始数组的内容128
的数组uint8_t
的,这就是uint8_t (*redimensioned)[8][128];
给我们,我们可以作为 N x 8 x 128
访问3 维数组(将其指向原始数组的内容后)。
为了让编译器满意,当我们指向 redimensioned
时在 framebuffer
我们必须强制转换它的内容,因为指针的类型是 framebuffer
衰减到与我们声明的指针类型不同...这就是 (uint8_t (*)[8][128])
所在的位置来自赋值(它是对“指向 128 个 uint8_t 的 8 个数组的数组的指针”的强制转换)。
关于改变c中分配内存的维数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31418121/