c - 增加一个固定值的指针

标签 c pointers memory microcontroller

下面的代码是一个示例,地址旨在指向微 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/

相关文章:

c - C 中输入的工作原理

c - 将值赋给 ScanF 中的 char *

c - 在 C 中使用 void 指针模拟通用链表

对于 'char' 类型,calloc 2 GB 内存失败,但对于 'short' 类型成功

ubuntu - Ubuntu 服务器上的 Delphi Linux 应用程序是否对仅控制台应用程序有最低 RAM 要求?

c# - 在 C# 中计算 CRC16

C程序中的困惑

C - printf 不显示完整的字符串

c - 将CPU和内存管理模型整合在一起

c - 在C中从文件到文件的读取和写入