改变c中分配内存的维数

标签 c memory malloc avr

考虑定义如下的帧缓冲区数组:

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/

相关文章:

Android 应用程序中的 java.lang.OutOfMemoryError

c++ - linux中进程的堆栈大小是否有限制

c - 当我打开 O_NONBLOCK 时,我得到 "0"和 "I/O error"

c++ - C libcurl,限制下载速度 - cpu 使用率达到 100%

c++ - C++ 中的 vector 存储

c++ - 程序在 IDE 外运行时崩溃

c++ - 返回对动态生成的二维数组的引用

c - 使用 dlmalloc 的段错误

c - 填充 malloc() 分配的内存的效果

C2440 错误,试图将 const char 更改为 char