首页 > 解决方案 > 用 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 之后获取下一个变量的开始,对吗?

标签: arrayscbeagleboneblack

解决方案


假设首先,根据您的 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]


推荐阅读