arrays - 用 C 在特定内存位置声明二维整数数组
问题描述
我在 BeagleBone Black MCU 上用 C 语言编写。我需要创建一个 2D unsigned int 数组来存储从两个传感器收集的一些模拟数据。目前我对每个传感器的数据都有单独的无符号整数数组,但我想将其更改为有一个二维变量,其中一维是数据来源的传感器。
这是我到目前为止所拥有的,它工作得很好。(如果格式不正确,我深表歉意。我尝试将代码加粗,但它似乎无法在 Chrome 中以我期望的方式工作。)
#define SHARE_MEM 0x10000
#define E_RING_BUFFER_SIZE 200
volatile unsigned int *DetTSampleSet = (unsigned int *) SHARE_MEM;
volatile unsigned int *DetBSampleSet = (unsigned int *) (SHARE_MEM + (E_RING_BUFFER_SIZE * sizeof(unsigned int)));
我相信这段代码可以确保 DetBSampleSet 紧跟在 DetTSampleSet 之后,并且没有重叠。它工作正常。我可以像这样使用这些变量。
int pnr;
for (pnr = 0; pnr <10;pnr++)
{
// do some stuff to get RawAnalog from sensor T.
DetTSampleSet[pnr] = RawAnalog;
// do some stuff to get RawAnalog from sensor B.
DetBSampleSet[pnr] = RawAnalog;
}
我想要的是这个。
int pnr;
for (pnr = 0; pnr <10; pnr++)
{
// do some stuff to get RawAnalog from sensor T (0)
DetSampleSet[0][pnr] = RawAnalog;
// do some stuff to get RawAnalog from sensor B (1)
DetSampleSet[1][pnr] = RawAnalog;
我想我可以像这样将它声明为这个内存空间中的第一个变量。
#define SHARE_MEM 0x10000
#define E_RING_BUFFER_SIZE 200
volatile unsigned int *DetSampleSet = (unsigned int *) SHARE_MEM
如果我这样做,我认为我不必担心这些数据在内存中的实际结构,如
是前四个字节 DetSampleSet[0][0] 和接下来的四个字节 DetSampleSet[0][1] 或 DetSampleSet[1][0] 因为我不打算使用任何指针/地址访问此数据?
但是,如果我想在内存中声明与该变量相邻且没有重叠的另一个变量,我是否只需像这样将大小偏移量加倍?
volatile unsigned int *NewIntVariableAfterFirstOne = (unsigned int *) (SHARE_MEM + (E_RING_BUFFER_SIZE * 2 * sizeof(unsigned int)));
感谢您的帮助和耐心,因为我在将近 30 年后重新回到 C 语言中。
我感谢评论和答案。我试图发布回复,但似乎我无法详细评论,但必须添加到我原来的问题中。所以这里...
所以,我欣然承认有时会在这样的指针声明中迷失方向。我发布的原始代码工作正常。我需要在这个内存空间中声明多个变量,所以我主要关心的是正确声明它们以免覆盖一个。基本上,确保声明的下一个变量的开始超过前一个声明的结束。因此,例如,如果指向整数变量 A 的指针被用作 X 元素的一维数组,那么 X sizeof(int) 应该是下一个变量的安全开始,比如整数变量 B。对吗?如果我想将变量 A 用作要作为二维数组访问的数组,那么我只需执行 2 X*sizeof(int) 即可在 A 之后获取下一个变量的开始,对吗?
解决方案
假设首先,根据您的 C 实现,以您正在执行的方式创建指针值是有效且适当的事情,您需要将指针声明为指向数组的指针,然后进行强制转换适当地:
#define SHARE_MEM 0x10000
#define E_RING_BUFFER_SIZE 200
volatile unsigned int (*DetSampleSet)[E_RING_BUFFER_SIZE] =
(unsigned int (*)[E_RING_BUFFER_SIZE]) SHARE_MEM;
然后,您应该能够通过双重索引来访问该块DetSampleSet
,正如您所说的那样,所有的值都DetSampleSet[0]
在内存中连续布置,并且紧接在那些 for 之前DetSampleSet[1]
。
推荐阅读
- linux - 将多个文件移动到linux中的目录
- image - AHK 按键仅在按下时显示图像
- c# - 使用 Asp.Net Core Identity 添加持久声明
- oracle-apex - 更改内联弹出窗口的位置
- css - 如何在 1 类保护伞下隔离整个 CSS 文件
- python - 填充没有字符串查询的 Postgresql 表
- clojure - xodus 游标的有效期是多久?
- php - 具有绑定参数的 PHP 变化查询。pgSQL VS MySQL 准备好的语句 | ?,?,? 对比 1 美元、2 美元、3 美元
- javascript - 关闭 .JS / .JSX 文件的 VSCode Typescript 错误并将它们保留用于 .TS / .TSX 文件?
- typescript - 如果我在 Vue.js 3 项目中使用 TypeScript,我的代码会被转译两次吗?