C语言中结构体成员的动态内存分配有关问题 [

C语言中结构体成员的动态内存分配问题 [
struct student
{
        char fristname[20];
        char *lastname=(char*)malloc(sizeof(char)*20);/*这里为lastname动态分配内存空间,编译时出错*/
        int score;
};
struct student st1;
st1.lastname=(char*)malloc(sizeof(char)*20);/*但是为结构体变量st1的成员st1.liastname动态分配内存却是可行的*/
scanf("%s",st1.name);
问题:为什么不能在结构体中对成员进行动态内存分配??

------解决方案--------------------
动态分配内存是在运行期作的事情,编译期不会做!
------解决方案--------------------
“声明”一个结构体时,并没有为他分配任何空间。在“定义”结构体类型的变量时,才为变量分配空间。

如果在“声明”结构体时就为其成员动态分配一块内存,那么这块内存的指针要保存在哪里?
------解决方案--------------------
struct student
{
        char fristname[20];
        char *lastname=(char*)malloc(sizeof(char)*20);/*这里为lastname动态分配内存空间,编译时出错*/
        int score;
};
这个东西叫结构体的定义,括号里面是成员列表,不可以是表达式,更不可以是语句
struct student st1;
st1.lastname=(char*)malloc(sizeof(char)*20);/*但是为结构体变量st1的成员st1.liastname动态分配内存却是可行的*/
scanf("%s",st1.name);
这个st1是叫做student结构体变量,也可以说叫做这个结构体变量的定义,已经分配好内存了,你就可以操控内存了对里面的成员进行申请空间或者赋值等等。。。
------解决方案--------------------
C++ 11 以前是不可以的。
C++ 11 已经可以了。

折其实是语言实现方面的问题。
早期的C++ 认为,成员变量,不可以在定义类型的时候初始化;
因为类型定义时,该类型的变量还没有定义。
所以,也就没有地址,所以不能初始化。

C++ 11认为,类的成员变量,可以和函数内部的变量一样初始化;相当于给他一个缺省值。
在类对象定义时,再实现初始化的代码!
就像函数内部定义的变量一样,在函数运行时初始化。
所以可以初始化。



------解决方案--------------------
可以为结构体做一个默认构造函数,在构造函数中进行动态分配内存,建议在析构中释放。
例如:
struct XXX
{
    char * pSty;
    XXX()
    {
        pStr = (char*)malloc(sizeof(char)*20);
    }
    ~XXX()
    {
        if(pStr)
        {
            free(pStr);
            pStr = NULL;
        }
    }
}