我想基本上做下面的事情(这可能是危险的,不是什么)只是为了它:
int main() {
int x = 0x00ff00ff;
printf("Value at addr x: %x\n",*x);
return 0;
}
基本上看一下我机器中某个地址的内容。也许写信给它。我猜我不允许做后者。
我得到的错误是error: invalid type argument of 'unary *'
。
有没有办法做到这一点?
答案 0 :(得分:6)
你需要一个指针:
int *x = (int*)0x00ff00ff;
你是对的,这可能不是一个好主意,除非你知道 0x00ff00ff
是某种有效的地址。它实际上并不是未定义的行为,因为标准规定您不能取消引用非法地址,但随后声明“非法”包括以下内容:
但未明确列出任意指针值,因为这会使嵌入式系统中的内存映射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>现在,什么是段错?”