假设我有以下代码:
my_struct_member_type *foo() {
volatile my_struct *s = (my_struct *)SOME_ADDRESS;
return &(s->struct_member);
}
foo返回的指针也是不稳定的吗?
编辑:后续:foo内的指针&(s->struct_member)
是否易变?
答案 0 :(得分:1)
没有。 volatile
是编译器提示,因此只要编译器可以看到它,它就会受到尊重。可以从另一个翻译单元调用该函数,该单元不知道你最初声明指针volatile
。
答案 1 :(得分:1)
是
对于volatile my_struct *s
来说,您通过它看到的对象是volatile
,并且您通过此指针访问的所有成员都会继承volatile
资格。
如果返回类型没有说明,则返回指向volatile
的指针的地址是违反约束,并且编译器必须已经为您提供了诊断。
修改:volatile
关键字适用的位置似乎也存在混淆。在您的示例中,它适用于指向的对象,而不是指针本身。根据经验,总是在没有类型更改的情况下尽可能向右写限定符(const
或volatile
)。那么你的例子就是:
my_struct volatile*s = (my_struct *)SOME_ADDRESS;
与
完全不同my_struct *volatile s = (my_struct *)SOME_ADDRESS;
指针本身是volatile
但不是它背后的对象。
编辑2:由于您要求我的来源,实际C标准C11,6.8.6.4说明了return
声明:
如果表达式的类型与返回类型不同 它出现的函数,该值被转换为,如果 赋值给具有函数返回类型的对象
对于赋值运算符,6.15.16.1对转换的期望是什么:
左操作数具有原子,限定或非限定指针类型, 和(考虑左值操作数在左值后的类型 转换)两个操作数都是限定或不合格的指针 兼容类型的版本,以及左侧指向的类型 右边指出的所有类型的限定符;
此处右侧的尖头类型与左侧的volatile
限定符相加。
答案 2 :(得分:0)
Volatile在运行时没有意义,它用于告诉编译器不优化对变量的访问。
返回volatile指针是无稽之谈。您将某些存储(左值)标记为易失性,而不是右值。
http://www.barrgroup.com/Embedded-Systems/How-To/C-Volatile-Keyword