《深度探索C++对象模型》p20 不解的地方,望解答

《深度探索C++对象模型》p20 困惑的地方,望解答
是这样的,在《深度探索C++对象模型》一书中,第一章“关于对象”中提到了一个在C语言中的编程技巧 --- 将单一元素的数组放在一个结构体的尾端,于是结构体变量可以拥有大小可变的数组,如下代码:
C/C++ code

struct mumble {
    char pc[1];
}

struct mumble *pmumbl = (struct mumble *)malloc(sizeof(struct mumble) +         strlen(string) + 1);
strcpy(pmumbl->pc, string);



我搜索了一些相关信息,但是还是没能解决不理解的地方,首先我先说一下自己的理解:
1、从string拷贝得到的数据,实际上是存放在堆区的,结构体mumble中的pc实际没有存放任何数据,所以有些编译器下可以写成char pc[0];
2、为什么在需要使用这种结构体的时候,不直接使用一个指针作为成员,比如char *pc?难道是因为char pc[1]比指针少几个字节的原因?
3、貌似要求pc必须放在mumble的尾端,假设在pc的后面还有其他的成员,这样会有什么问题吗?pc中本来就不存放数据,后面有成员貌似也没有什么影响啊?如下代码:
C/C++ code

struct mumble {
    char pc[1];
    int data;
}


这样的结构体会有什么问题吗?前面的变长数据并没有保存到mumble中,而是位于堆区,而成员data则直接保存了数据,貌似这样也可以的吧?

大致就是以上几个问题吧,请指导的帮忙解答下,总是想不明白第一个这么用的人到底是怎么想的。。。

------解决方案--------------------
C/C++ code

struct mumble {
    char pc[1];
}

struct mumble *pmumbl = (struct mumble *)malloc(sizeof(struct mumble) +         strlen(string) + 1);
strcpy(pmumbl->pc, string);