C: Неустойчивые массивы в C

Ключевое слово volatile используется в C, чтобы предотвратить компилятор, выполняющий определенные оптимизации, среди других тонких изменений, для переменной.

Например:

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 и С++?

Ответ 1

Да, volatile требуется, а объявление права:

volatile unsigned char *my_data;

Это объявляет my_data указателем на volatile unsigned char.

Чтобы сделать сам указатель volatile, вам понадобится это:

unsigned char *volatile my_data;

И, конечно, и указатель, и данные с указателем могут быть неустойчивыми:

volatile unsigned char *volatile my_data;

Нет никакой разницы между C и С++.