【问题标题】:volatile as argument identifiervolatile 作为参数标识符
【发布时间】:2016-09-10 22:25:09
【问题描述】:

我在最近的一次采访中被问到一个问题,下面定义了一个函数

int square(volatile int * p)
{
    return *p**p;
}

有人告诉我这个函数有问题,不适合计算平方,我认为这是由于 volatile,谁能解释为什么?

【问题讨论】:

  • 因为volatile 表明*p 可能会在评估*p * *p 的过程中发生变化。尤其是在嵌入式设备上,p 可能是任何奇怪的东西,例如指向某个内存的指针,其中某些硬件直接存储并不断更新计数器或其他东西的当前值,或者说一些奇特的东西,每次你读取它时都会改变它的值,或者其他什么,天空真的是那里的极限。
  • 因此,在这种情况下,将 p 之类的指针定义为易失性是否是正常做法,这样做的优点和缺点是什么
  • 正常情况下,这个函数根本不涉及任何指针...
  • @Uint32 很多关于这个主题的好文章可以在这里找到:barrgroup.com/Embedded-Systems/How-To/Articles
  • @Uint32 :Lundin 所说的 - 无论如何,Micheal Barr 的许多文章都出现在 Embedded.com 上。您可以在书架上摆满有关嵌入式系统开发各个方面的书籍。对于一般全面的报道,请考虑 Colin Walls 的 Embedded Software: The Works - 他也是 Embedded、com 和其他出版物上许多文章的作者。

标签: c pointers


【解决方案1】:

可能会有这样的假设,因为*p 是一个 volatile 访问,它的值在每次评估期间可能会有所不同,因此您应该只评估一次:

int q = *p;
return q * q;

这当然是愚蠢的设计;该函数应该是int square(int)调用者应该是square(*p)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    相关资源
    最近更新 更多