Compiler Warning (level 4) C4328

'function' : indirection alignment of formal parameter parameter_number (alignment_value_for_parameter) is greater than the actual argument alignment (actual_alignment)

By default on Itanium and CE (other than x86 CE based) platforms, data must be aligned to ensure that the application will run. This means that the address of a variable must be a multiple of the size of the variable's primitive type. (Two-byte Unicode strings must also be aligned.)

To resolve this warning, do not explicitly specify a struct alignment that will result in unaligned structure members. Or, explicitly specify that your function parameters will take unaligned data. For more information, see __unaligned and #pragma pack.

Example

C4328 can occur when you pass an unaligned pointer to a function expecting an aligned pointer.

The following sample generates C4328.

// C4328.cpp
// compile with: /W4 /Wp64
// processor: x64 IPF
#pragma pack(push)

#pragma pack(1)
struct S {
   int i;
};

struct Other {
   char c;
   S s;
};

// allow compiler to align structs on natural boundaries
#pragma pack(pop)

struct S2 {
   int i;
};

struct Other2 {
   char c;
   S2 s;
};

void f(int * p) {
   p++;
}

void f2(__unaligned int * p) {
   p++;
}

int main() {
   Other o;
   S* pS = &o.s;
   f(&pS->i);   // C4328
   f2(&pS->i);   // OK

   Other2 o2;
   S2* pS2 = &o2.s;
   f(&pS2->i);   // OK
}

The following sample is a more subtle cause of C4328. The following sample generates C4328.

// C4328_b.cpp
// compile with: /W4 /Wp64 /c
// processor: x64 IPF

// OK
struct T {
   int i;
};

void f2(int* p2);
void g2(T* t) {
   f2(&t->i);
}

// OK
#pragma pack(1)
struct U {
   int i;
};

void f3(__unaligned int* p3);
void g3(U* u) {
   f3(&u->i);
}

// warning
#pragma pack(1)
struct S {
   int i;
};

void f(int* p);
void g(S* s) {
   f(&s->i);   // C4328
   s->i = 0;
}