检查和修改C中的内存地址

JDS*_*JDS 1 c pointers memory-address

我想基本上做以下(这可能是危险的,不是什么)只是为了它:

int main() {

    int x = 0x00ff00ff;

    printf("Value at addr x: %x\n",*x);


    return 0;
}
Run Code Online (Sandbox Code Playgroud)

基本上看一下我机器中某个地址的内容.也许写信给它.我猜我不允许做后者.

我得到的错误是error: invalid type argument of 'unary *'.

有没有办法做到这一点?

pax*_*blo 6

你需要一个指针:

int *x = (int*)0x00ff00ff;
Run Code Online (Sandbox Code Playgroud)

你是对的,这可能不是一个好主意,除非你知道0x00ff00ff是某种有效的地址.它实际上并不是未定义的行为,因为标准规定您不能取消引用非法地址,但随后声明"非法"包括以下内容:

  • 已释放堆对象的地址.
  • NULL指针.
  • 错误的对齐.

但是没有明确列出任意指针值,因为这会使嵌入式系统中的内存映射I/O出现问题.

例如,您可以通过读取或写入已知的内存映射I/O地址来控制嵌入式系统中的UART(通用异步接收器/发送器,基本上是串行端口器件):

#define UART_READ_READY  ((char*)0xff00)
#define UART_READ_CLEAR  ((char*)0xff01)
#define UART_DATA        ((char*)0xff02)

char getUartCharWithWait (unsigned int tries) {
    char retChar;
    unsigned int limit;

    // Keep looping until character available, at least for a while.

    limit = tries;
    while (*UART_READ_READY == 0)
        if (limit-- == 0)
            return '\0';

    // Get character, tell UART to clear it, then return it.

    retChar = *UART_DATA;
    *UART_CLEAR = 1;

    return retChar;
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,您有以下代码:

retChar = *UART_DATA;
Run Code Online (Sandbox Code Playgroud)

它将char从"存储器"地址读取字节(C )0xff02,该地址实际上来自监视地址总线并拦截特定地址的设备.