【问题标题】:assign hardcoded address to pointer in C将硬编码地址分配给C中的指针
【发布时间】:2021-09-26 13:25:16
【问题描述】:

我很惊讶为什么我的编译器允许我使用硬编码的指针地址?为什么它不崩溃?根据我的理解,逻辑地址是编译器选择的。

main()
{
    int *p;
    
    p = 10;          // why it is allowed? Ideally, it should be    int a; p = &a;
    
    printf("%u", p);
}

【问题讨论】:

  • 在具有虚拟内存的系统上没有多大意义,但在具有内存映射 IO 的硬件系统上确实有意义。
  • 您应该会收到来自编译器的警告。见stackoverflow.com/a/8288548
  • 进行分配不是问题,但使用它可能会。试试p=10; *p = 1;

标签: c pointers


【解决方案1】:

C 进化并被设计用于许多不同的目的。在通用多用户操作系统中,程序在虚拟地址空间中运行,内存地址的分配基于操作系统提供的内容、程序加载方案以及通过堆栈进行的分配、内存管理例程、内存映射例程和/或其他服务。

在专用系统中,内存地址可能是手动分配的,也可能是硬件要求造成的。这是 C 支持的目的之一。

即使在多用户操作系统中,系统也可能会在固定地址提供一些数据,例如 macOS 中的“公共页面”。但是,在这种情况下,地址可能是通过头文件中的定义提供给您的,因此您将使用 int *p = _SomeSymbolFromTheCommonPage; 而不是自己直接编码数字地址。

编译器通常会警告您将整数裸分配给指针,如p = 10;。您的编译器可能有一个将警告视为错误的开关(-Werror 用于 GCC 和 Clang,/WX 用于 MSVC),启用它并学习修改代码以避免警告通常是一个好主意。当您想故意分配一个硬编码地址时,您可以使用强制转换来表明它是故意的:p = (int *) 10;,并且通常编译器不会为此发出整数到指针的警告。

【讨论】:

    猜你喜欢
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多