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

时间:2012-03-16 02:33:41

标签: c pointers memory-address

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

int main() {

    int x = 0x00ff00ff;

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


    return 0;
}

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

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

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:6)

你需要一个指针:

int *x = (int*)0x00ff00ff;

你是对的,这可能不是一个好主意,除非你知道 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;
}

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

retChar = *UART_DATA;

将从“内存”地址char读取一个字节(C 0xff02),该字节实际上来自监视地址总线并拦截特定地址的设备。

答案 1 :(得分:4)

您收到前面提到的错误,因为无法取消引用 int,使x成为指针指向将产生“正确”的结果(即,它将能够编译)。

int * x = (int*)0x00ff00ff;

“它有效,有效!或者......我的意思是,它编译。<​​strong>现在,什么是段错?”

相关问题