Compiler Warning (level 4) C4815

'var' : zero-sized array in stack object will have no elements (unless the object is an aggregate that has been aggregate initialized)

An array with an undefined number of elements (zero-sized array) is the last member of a type and an object of the type was created on the stack. No memory will be allocated for the array. If you need a useful constructor, you can allocate memory for the struct on the heap.

The following sample generates C4815:

// C4815.cpp
// compile with: /W4
#include <memory>
#pragma warning(disable : 4200)
struct S1
{
   int i;
   char cArr[];
};

S1 s1_glb;   // C4815 stack object with zero-array (not aggregate inited)
// try the following line instead
// S1 s1_glb = { 0, 0, 0 };

struct S2
{
   S2(int _i) : i(_i) {}
   int i;
   char cArr[];
};

S2 s2_glb1(10);   // C4815
// try the following line instead
// S2 s2_glb1 = { 10 };  // to work, comment the constructor

int main()
{
   S1 s1_loc1;   // C4815
   // try the following line instead
   // S1 s1_loc1 = { 0 };

   S1 s1_loc2 = { 1, { 'a', 'b', 'c' } };

   S1 s1_loc3 = s1_loc2;   // C4815 truncation when copy ctor called
   // truncation if call a compiler-generated copy constructor
   // to copy a struct with a zero sized array in it
   s1_loc1;
   s1_loc2;
   s1_loc3;

   // allocate memory for struct on heap
   int nEle = 10;   // allocate 10 chars for char array
   void * pV = malloc (sizeof(S2) + nEle * sizeof(char));
   S2 *pS1 = new (pV) S2(nEle);
   pS1;
}