This topic was discussed in the following thread, but nothing seems to have happened. I couldn't find a bug report. <http://gcc.gnu.org/ml/gcc/2003-09/msg01031.html>
The test case below demonstrates some problems with arrays of aligned types. Packing the aligned type in a structure fixes the problems. Results: FAIL: sizeof(foo_aligned)!=8 {7!=8} FAIL: sizeof(foo_aligned_array)!=100*8 {700!=800} FAIL: p2-p1!=3*8 {18!=24} It appears that getting the address of x[3] rounds the size down to the alignment, so this should be fixed by ensuring that the size is a multiple of the alignment. #include <stdio.h> #include <stdlib.h> typedef char foo[7]; typedef foo foo_aligned __attribute__((aligned(2))); typedef struct { foo_aligned c; } foo_aligned_struct; typedef foo_aligned foo_aligned_array[100]; typedef foo_aligned_struct foo_aligned_struct_array[100]; int result = 0; void fail(const char *as, int a, const char *bs, int b) { fprintf(stderr, "FAIL: %s!=%s {%d!=%d}\n", as, bs, a, b); result = 1; } #define expect(A,B) \ do { if((A)!=(B)) fail(#A, A, #B, B); } while(0) int main() { foo_aligned_array x; foo_aligned_struct_array y; char *p1, *p2; expect(sizeof(foo_aligned), 8); expect(sizeof(foo_aligned_struct), 8); expect(sizeof(foo_aligned_array), 100*8); expect(sizeof(foo_aligned_struct_array), 100*8); p1 = (char*)&(x[0]); p2 = (char*)&(x[3]); expect(p2-p1, 3*8); p1 = (char*)&(y[0]); p2 = (char*)&(y[3]); expect(p2-p1, 3*8); return result; } -- Summary: Size of type not multiple of its alignment. Product: gcc Version: 4.0.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: neilt+bugs at chiark dot greenend dot org dot uk GCC build triplet: i486-linux-gnu GCC host triplet: i486-linux-gnu GCC target triplet: i486-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24944