【问题标题】:What's wrong with below c logic?下面的c逻辑有什么问题?
【发布时间】:2017-05-28 14:40:44
【问题描述】:
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;}

上面的代码 sn-p 在我的 linux 机器上运行 但;当在我的 32 位目标板上 ptr 是指向类型 uint32 映射寄存器地址的易失性指针时,可以如下所示写入该寄存器:

*(volatile uint32*)ptr = 0x00000001;

【问题讨论】:

  • 您的目标是什么 CPU/平台/系统?该 CPU/平台/系统上的地址 0x1000 是什么意思?如果它是一个 32 位寄存器,那么你不能只对它进行部分写入吗?
  • 对 volatile 的更改是相关更改还是对 uint32* 的更改?
  • 这两个代码 sn-p 互不相关。我的查询与将某些值分配给某个地址的方式有关。当我执行 '(volatile uint32)ptr = 0x00000001;'这对我来说很好,这里 ptr 指向 IO 映射地址。而当我在我的 linux 机器上运行第一个小代码 sn-p 时,它给了我分段错误。
  • @Someprogrammerdude 谢谢我理解你的意思。

标签: c embedded


【解决方案1】:

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

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

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

char * ptr = (char *) 0x1000;

(volatile uint32*)ptr = 0x00000001;

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

【讨论】:

  • 如果您对OPs问题的细节有疑问,请使用cmets来澄清。如果您没有这样做的特权,那么请寻找您清楚的问题。您的回答似乎与问题无关,这正是为什么这两种方法之间的差异可以使一种工作而另一种不工作。
  • @Yunnosch 根据目前的信息,我的回答,恕我直言,因为它解释了“C”“逻辑”有什么问题,假设 C 具有一致的行为,而与硬件无关。一旦他们用更多信息更新他们的问题,我将更新我的答案。我相信我已经回答了他们的基本问题。 “这个 C 逻辑有什么问题?”。
  • 这确实不能回答问题。从给出的信息来看,我们只有标准规定的内容,这意味着 UB。 “根据目前的信息......” - 这正是不应该回答不清楚的问题的原因。评论以请求所需的信息。在你有代表之前,你必须等待其他人。如果您仍然提供答案,它很可能会被标记或被否决。无论哪种方式,oyu 都不会更快地获得代表。
猜你喜欢
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
相关资源
最近更新 更多