c/c++语言开发共享我们可以为给定的内存位置分配值吗?

我想将一些值(比如2345)分配给一个内存位置(比如说0X12AED567)。 可以这样做吗?

换句话说,我该如何实现以下function?

void AssignValToPointer(uint32_t pointer, int value) { } 

    答案取决于一些因素。 您的程序是否在现代操作系统中运行?

    如果是,尝试访问未映射的内存区域将导致SIGSEGV 。 要实现这一点,您必须使用特定于系统的函数来映射包含此确切地址的内存区域,然后再尝试访问它。

    你提出这个问题的事实表明你已经过了头脑。 但是你走了:

     *(int *)0x12AED567 = 2345; 

    只需将内存位置视为指针即可

     int* pMemory = OX12AED567; *pMemory = 2345; 

    注意:仅当程序可以访问和写入该内存位置时,此方法才有效。 写入这样的任意存储位置本质上是危险的。

    就C而言,这是未定义的行为。 我的以下建议也是未定义的行为,但避免了所有基于类型和基于别名的问题:使用字符。

     int a = get_value(); char const * const p = (const char * const)&a; char * q = (char *)0x12345; memcpy(q, p, sizeof(int)); 

    或者,您可以直接访问字节q[i] 。 (这是UB的一部分:指针q不是作为实际对象的地址获得的,也不是作为分配函数的结果。有时这是正常的;例如,如果你正在编写一个独立的程序,在实模式下运行并访问图形硬件,您可以直接在一个众所周知的硬编码地址写入图形内存。)

    C99标准草案

    没有实现定义的行为,这可能是不可能的。

    关于演员:

     *(uint32_t *)0x12AED567 = 2345; 

    C99 N1256标准草案 “6.3.2.3指针”说:

    5整数可以转换为任何指针类型。 除非先前指定,否则结果是实现定义的,可能未正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示。 56)

    GCC实施

    GCC将其int指向以下的指针实现: https : //gcc.gnu.org/onlinedocs/gcc-5.4.0/gcc/Arrays-and-pointers-implementation.html#Arrays-and-pointers-implementation

    如果指针表示小于整数类型,则从整数到指针的强制转换丢弃最高有效位,如果指针表示大于整数类型,则根据整数类型的符号扩展,否则位不变。

    所以演员阵容将按照预期的方式运作。 我希望其他编译器能做类似的事情。

    附带条件是它不便携或安全(根本):

     *((int *)0x12AED567) = 2345; 

    您已指出,该地址是一个物理地址,并且您的代码正在进程中运行。

    所以,如果你是

    现在,您有一个有效的映射或物理地址本身,您传递给您的函数。

     void AssignValToPointer(uint32_t pointer, int value) { * ((volatile int *) pointer) = value; } 

    您可能希望添加volatile关键字,因为如果您之后没有从该位置读取(可能是写入内存映射硬件的寄存器的情况),编译器可能会优化写操作。

    您可能还希望使用uintptr_t数据类型而不是uint32_t作为指针。

    需要了解更多c/c++开发分享我们可以为给定的内存位置分配值吗?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享我们可以为给定的内存位置分配值吗?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/979715.html

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月13日

      精彩推荐