2017-05-28 51 views
-3
int main(){ 
    char * ptr = (char *) 0x1000; 
    *(char *)ptr = 0; //Illegal memory access 
    printf("ptr %p\n", ptr); //prints the address (hex); ptr is pointing memory location 0x1000. 
    printf("ptr %d\n", *ptr); //illegal memory access 
return 0;} 

上面的代码片段在我的linux机器上运行 但;当我在32位的目标板PTR是挥发性的指针uInt32类型映射寄存器地址然后它的好来注册类似下面写上说:以下c逻辑有什么问题?

*(volatile uint32*)ptr = 0x00000001; 
+0

你的目标CPU /平台/系统是什么?该CPU /平台/系统上地址0x1000的含义是什么?如果它是一个32位寄存器,那么你不能只是部分写入它? –

+1

是否改变相关更改或更改为uint32 *? – Yunnosch

+0

这两个代码片段都不相互关联。我的查询与某些地址赋值的方式有关。当我做'*(volatile uint32 *)ptr = 0x00000001;'这工作正常,我在这里ptr指向IO映射地址。而当我运行第一个小代码片段到我的Linux机器时,它给我分段错误。 –

回答

-2

我不知道你正在尝试做的事,但我认为你正在为某些微控制器或类似的东西写一些固件。你的问题听起来更像XY问题。

C,作为一种低级编程语言取决于硬件细节,远远超过诸如Ruby之类的高级语言。很多将取决于哪个处理器和该代码运行在哪个操作系统下。本质上,您正在询问代码的运行时行为,但您没有提供有关代码运行位置的足够信息。

为指针指定值可能指向或不指向任何地方,这取决于处理器和操作系统。而且,并非所有的处理器和指令集都将寄存器映射到内存空间中所以,

char * ptr =(char *)0x1000;

OR

(挥发性UINT32 *)PTR = 00000001;

可能指向一个32位寄存器或可能指向一个物理内存或可能指向一个有效的虚拟地址或可能指向无效或未映射的虚拟地址或可能只是指向无处。全部取决于硬件环境。

+1

如果您对OP问题的细节有疑问,请使用注释来澄清。如果你没有这些特权,那就找一个你很清楚的问题。你的回答似乎没有问题,这恰恰就是为什么两种方法之间的区别可以使一个工作而另一个不能工作。 – Yunnosch

+0

@Yunnosch根据当前的信息,我的回答是,恕我直言适合,因为它解释了'C''逻辑'有什么问题,这是C无论硬件如何都具有一致行为的假设。一旦他们用更多的信息更新他们的问题,我会更新我的答案。我确信我已经回答了他们的基本问题。 '这个C逻辑有什么问题?'。 –

+0

这确实没有回答这个问题。从给出的信息,我们只有标准规定的内容,这意味着UB。 “有了最新的信息......” - 这就是为什么不能回答不清楚的问题的原因。评论以请求所需的信息。在你有代表之前,你必须等待其他人。无论如何,如果你提供了答案,它很可能会被标记或低估。无论哪种方式oyu不会更快得到代表。 – Olaf