小编use*_*790的帖子

数组和类型转换的volatile的含义

伙计们,

考虑这段(令人憎恶的)一段代码:

volatile unsigned long a[1];  
unsigned long T; 

void main(void) 
{    
    a[0] = 0x6675636b;   /* first access of a */
    T = *a; 
    *(((char *)a) + 3) = 0x64; /* second access of a */
    T = *a;
}
Run Code Online (Sandbox Code Playgroud)

......问题:是((char *)a)波动的还是非波动的?

这引出了一个更大的问题:两个访问之间是否存在依赖关系?也就是说,人类的常识说有,但是C99标准说易变的东西不会混淆非易失性的东西 - 所以如果((char *)a)是非易失性的,那么这两个访问不会别名,并且没有依赖.

更准确地说,C99 6.7.3(第5段)内容如下:

"如果尝试通过使用具有非volatile限定类型的左值来引用使用volatile限定类型定义的对象,则行为是未定义的."

因此,当我们进行类型转换时a,volatile限定符是否适用?

c arrays casting volatile

6
推荐指数
1
解决办法
249
查看次数

标签 统计

arrays ×1

c ×1

casting ×1

volatile ×1