The alignment attribute specifies the alignment of variables or structure fields, not single array elements. See Specifying Attributes of Variables and Common Variable Attributes for details.
If you always want to align two integers together, you can define a structure
struct dma_transfer {
unsigned int e0 __attribute__ ((aligned (16)));
unsigned int e1 __attribute__ ((aligned (16)));
};
This aligns the elements on 16 byte boundaries.
int main(int argc, char **argv)
{
static struct dma_transfer a;
static unsigned int b[2];
printf("a.e0 = %p\n", &a.e0);
printf("a.e1 = %p\n", &a.e1);
printf("b[0] = %p\n", &b[0]);
printf("b[1] = %p\n", &b[1]);
return 0;
}
gives, e.g.
a.e0 = 0x601060
a.e1 = 0x601070
b[0] = 0x601080
b[1] = 0x601084
But this means also, that you have holes between the two integer values. On a 32 bit system, you will have
| int 4 bytes | hole 12 bytes |
| int 4 bytes | hole 12 bytes |