For the code(Full demo) like:
#include <iostream>
struct A
{
    int a;
    char ch[1];
};
int main() 
{
    volatile A *test = new A;
    test->a = 1;
    test->ch[0] = 'a';
    test->ch[1] = 'b';
    test->ch[2] = 'c';
    test->ch[3] = '\0';
    std::cout << sizeof(*test) << std::endl
              << test->ch[0] << std::endl;
}
I need to ignore the compilation warning like
warning: array subscript 1 is above array bounds of 'volatile char 1' [-Warray-bounds]
which is raised by gcc8.2 compiler:
g++ -O2 -Warray-bounds=2 main.cpp
A method to ignore this warning is to use pointer to operate the four bytes characters like:
#include <iostream>
struct A
{
    int a;
    char ch[1];
};
int main() 
{
    volatile A *test = new A;
    test->a = 1;
    // Use pointer to avoid the warning          
    volatile char *ptr = test->ch;
    *ptr = 'a';
    *(ptr + 1) = 'b';
    *(ptr + 2) = 'c';
    *(ptr + 3) = '\0';
    std::cout << sizeof(*test) << std::endl
              << test->ch[0] << std::endl;
}
But I can not figure out why that works to use pointer instead of subscript array. Is it because pointer do not have boundary checking for which it point to? Can anyone explain that?
Thanks.
Background:
- Due to padding and alignment of memory for struct, though ch[1]-ch[3]instruct Ais out of declared array boundary, it is still not overflow from memory view
- Why don't we just declare the chtoch[4]instruct Ato avoid this warning?
 Answer:
 struct Ain our app code is generated by other script while compiling. The design rule for struct in our app is that if we do not know the length of an array, we declare it with one member, place it at the end of the struct, and use another member likeint ainstruct Ato control the array length.
 
     
    