首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请教,input/output 为什么会出错 结构体指针不能这么用么》

2013-07-04 
请问,input/output 为什么会出错结构体指针不能这么用么》GeShou* aa(struct GeShou *)malloc(sizeof(str

请问,input/output 为什么会出错 结构体指针不能这么用么》
    GeShou* a;
    a=(struct GeShou *)malloc(sizeof(struct GeShou));
    if(a!=NULL)
        cout<<"ok"<<endl<<sizeof(*a);
    a->name="LinZhixuan";
    a->age=22;
    a->song="凤凰花开的路上";
    cout << a->name << endl;
    cout << a->age<< endl;
    cout << a->song << endl; struct malloc ccodeblock
[解决办法]
string 类型是需要构造函数的,当然不行,是 char* 还差不多
[解决办法]


//1)用C的方法,字符串用固定长度字符数组。
struct GeShou{
    char name[20];
    int age;
    char song[80];
};
void playSong()

    GeShou* a=NULL;//这个不必学C了。
    a=(struct GeShou *)malloc(sizeof(struct GeShou));//这个其实也,不必学C了,虽然这也不是错。
    //a = (GeShou *)malloc(sizeof( GeShou ) ); //C++ 结构名,本身就是类型名了,不必加struct 。
    if(!a) return ;
    cout<<"ok"<<endl<<sizeof(*a);
    strcpy(a->name,"LinZhixuan");//只能用strcpy这样了。
    a->age=22;
    strcpy(a->song,"凤凰花开的路上");//只能用strcpy这样了。
    cout << a->name << endl;
    cout << a->age<< endl;
    cout << a->song << endl;
    free(a);  //分配的内存,用完要释放。
}
//2)用C++的方法,字符串用string。
struct GeShou{
    string name;
    int age;
    string song;
};
void playSong()


    GeShou* a=NULL;
    a=new GeShou;//new 会自动调用构造函数,成语变量的构造函数,也会自动调用。
                 //malloc只会分配内存,因为C的malloc就是这个样子的。  
    if(!a) return ;
    cout<<"ok"<<endl<<sizeof(*a);
    a->name = "LinZhixuan";
    a->age=22;
    a->song = "凤凰花开的路上";
    cout << a->name << endl;
    cout << a->age<< endl;
    cout << a->song << endl;
    delete a;  //new 分配的要用 delete释放,会自动调用析构函数的。
}


PS: 
对于像成员变量含有string这种类型数据成员的数据结构的指针:

----string这种类型,内部含有指针成员,自己会动态分配内存;----

只有用new 分配内存才可以,不然不会自动初始化,string这种类型的对象或者成员对象的。

那么string这种类型,内部的这个指针,既不会是NULL,也不会指向任何,
可以正常使用的内存,即这个内部的指针,就是个野指针了。
可想而知,后面的赋值操作 ,如 a->name = "LinZhixuan",就会出错了!

一个数据结构,包含string这样类型的,成员变量,只能用new 分配内存,不然会出错;

或者可以,用很麻烦的方法,模拟new处理内存分配和对象的初始化;
不过C++已经,有很好的方法了,为何不用??

热点排行