我需要第二个数组在第一个数组之后开始。
形成一个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)