Haldean Brown Haldean Brown - 4 years ago 102
C Question

Declaring atomic pointers vs. pointers to atomics

I understand that the following declaration creates an array of values, each of which is atomic:

_Atomic int x[10];


However, I'm unclear on whether this:

_Atomic int *x;
x = calloc(10, sizeof(int));


Creates an array of 10 atomic integers, or is an atomic pointer to an array of nonatomic integers. Does that syntax declare an array of atomics or an atomic pointer to an array, and whichever it is, how does one declare the other?

(Note: I'm aware of
atomic_int
, and in the presented example it would remove the ambiguity. This is a simpler version of what I'm actually trying to do, which uses an atomic enum. Thanks!)

Answer Source

It's pointer to atomic integer, see http://en.cppreference.com/w/c/language/atomic .

To declare atomic pointer to an integer, you would need to put the keyword right before the variable:

 int * _Atomic x;

Note that the example with calloc may work on common platforms but generally there is no warranty that the types of non-atomic and atomic variables are the same. So it's necessary to initialize the variables with ATOMIC_VAR_INIT:

 x = calloc(10, sizeof(_Atomic int));
 for (...) ATOMIC_VAR_INIT(x[i]);
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download