如何解决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)
的地址,因为代码必须通过这些名称引用数组。
可以用 union
和 define
解决。 _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 举报,一经查实,本站将立刻删除。