c – C:C中的挥发性数组

在C中使用volatile关键字来防止编译器对变量执行某些优化,以及其他微妙的更改.

例如;

volatile int my_int = 0;

创建一个整数.在某些情况下,可能会阻止以下优化:

while(my_int == 0); // Loop until my_int != 0

优化到:

while(1); // Loop infinity.

这对于包括嵌入式系统中经常遇到的情况非常有用,例如可以通过中断函数调用对变量进行修改的情况.还有很多其他的例子,这个技术是有用的. my_int可能是由这样的功能修改的标志. (这只是玩具模型.)

但是,考虑由函数修改的数据是数组的情况.数据可以由指针指向.

unsigned char* my_data = new unsigned char[256];

在这种情况下,考虑到my_data是这个问题的具体情况下的全局变量[1],volatile关键字是多余的还是还需要?

[1]可能没关系.

如果答案是volatile关键字是必需的,使用正确的语法是什么?

例如,volatile unsigned char * my_data,我假定声明本身是volatile,而不是它指向的数据.

最后,C和C之间的区别呢?

解决方法

是的,挥发性是必需的,正确的声明是:
volatile unsigned char *my_data;

这将my_data声明为指向volatile unsigned char的指针.

为了使指针本身不稳定,您需要改为:

unsigned char *volatile my_data;

当然,指针和指向数据都可能是波动的:

volatile unsigned char *volatile my_data;

C和C之间没有区别.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...