微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C99中连续内存分配两个全局数组

如何解决C99中连续内存分配两个全局数组

我想为闪存访问模块编写一些单元测试。我有

extern char_t _internal_flash_start[]; /**< Exported from ICF file. */
extern char_t _internal_flash_end[]; /**< Exported from ICF file. */

我认为将我自己的数组作为闪存内容注入是完美的,因为在应用程序中这些符号是通过链接文件提供的。在我的测试中,我想要类似的东西:

char_t _internal_flash_start[2048]; /**< Exported from ICF file. */
char_t _internal_flash_end[1];

但我需要第二个数组恰好在第一个数组之后开始。我尝试了很多,但我无法让它为我工作。有没有办法实现给定的声明并在内存中拥有连续的数组?

[编辑 1/2021]

我需要 _internal_flash_end 位于 _internal_flash_start + sizeof(_internal_flash_start) 的地址,因为代码必须通过这些名称引用数组。

解决方法

我需要第二个数组恰好在第一个数组之后开始。

形成struct

struct my_data {
  char_t _internal_flash_start[2048]; /**< Exported from ICF file. */
  char_t _internal_flash_end[1];
} x;

仍然可能成员之间有填充:当然不太可能使用char_t [2048]

特定于实现的 packed 将确保没有填充。


一个迂腐的解决方案会创建一个数组并使用指向它的部分的指针。然而现在我们有 2 个指针,而不是两个数组。它们的 sizeof 将与上述不同。

char_t _internal_flash[2048+1];
char_t *_internal_flash_start = &_internal_flash[0];
char_t *_internal_flash_end   = &_internal_flash[2048];

OP 补充:

我需要 _internal_flash_end 位于 _internal_flash_start + sizeof(_internal_flash_start) 的地址,因为代码必须通过这些名称引用数组。

可以用 uniondefine 解决。 _internal_flash_start 仍然是一个数组。

union {
  char_t both[2048 + 1];
  char_t start[2048];
} _internal_flash;
#define _internal_flash_start (_internal_flash.start)
#define _internal_flash_end (_internal_flash_start + sizeof _internal_flash_start)

用法

int main() {
  printf("%p\n",_internal_flash_start);
  printf("%p\n",_internal_flash_end);
  printf("%zu\n",sizeof _internal_flash_start);
}

输出

0x10040b020
0x10040b820
2048
  

如果代码需要 _internal_flash_end 作为数组而不仅仅是指针,请尽可能使用实现特定的 packed

struct __attribute__((packed)) { // gcc specific
  char_t start[2048];
  char_t end[1];
} _internal_flash;
#define _internal_flash_start (_internal_flash.start)
#define _internal_flash_end   (_internal_flash.end)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。