下面的代码是一个示例,地址旨在指向微 Controller 的闪存,因此它不会指向任何垃圾数据。
我想做的是将指针“end_address”指向内存块的末尾。在这种情况下, block 的开始是 0x00001000, block 的结束是 0x00002000。我想通过使用起始地址和内存块大小的知识来设置“end_address”变量。
这是解决问题的好方法吗? 好的是可读代码,欢迎任何其他建议!
static const uint32_t memory_size = 0x00001000;
static volatile const uint32_t* start_address = (volatile const uint32_t*)0x00001000;
static volatile uint32_t* end_address;
int main(int argc, char *argv[])
{
end_address = start_address + (memory_size/sizeof(end_address));
printf("End adress: %x \n", end_address);
return 0;
}
最佳答案
要解决你的问题,替换这个
end_address = start_address + (memory_size/sizeof(end_address));
与:
end_address = start_address + (memory_size/sizeof(*end_address));
原因:end_address
本身是一个指针,而*end_address
实际上是指针指向的数据类型。当 sizeof(uint32_t) != sizeof(char*)
时会导致问题,例如在 64 位或 16 位系统上。
然而,当您使用内存地址进行操作时,我建议您使用类型为 char*
的指针,这样您就可以对其进行直接算术运算:
char *memory_size = 0x00001000;
uint32_t memory_size = 0x1000;
char *end_address = memory_size + memory_size;
/* then it's assured that end_address == 0x00002000 */
关于c - 增加一个固定值的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20514854/