下面的c逻辑有什么问题?

时间:2017-05-28 14:40:45

标签: c embedded

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映射的寄存器地址然后将其写入如下所示的那个寄存器:

*(volatile uint32*)ptr = 0x00000001;

1 个答案:

答案 0 :(得分:-2)

我不知道你要做什么,但我认为你正在为某些微控制器或类似的东西编写某种固件。你的问题听起来有点像XY问题。

作为低级编程语言的C语言比Ruby等高级语言更依赖于硬件细节。很多将取决于运行此代码的处理器和操作系统。基本上,您要询问代码的运行时行为,但是您没有提供有关代码运行位置的足够信息。

直接为指针赋值可能会也可能不会指向任何地方,这取决于处理器和操作系统。此外,并非所有处理器和指令集都将寄存器映射到存储空间。所以,

char * ptr =(char *)0x1000;

OR

(volatile uint32 *)ptr = 0x00000001;

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