These two do not match:
Code:
    const char * const * buf[50];
    const char * const * x;
The [50] is kind of like adding yet another *.
Have you tried it with just
Code:
    const char * const buf[50];
    // or even just
    const char * buf[50];
It's also odd to say *&buf[0]. Why not just buf[0]?