鱼C论坛

 找回密码
 立即注册
查看: 1300|回复: 7

有关string的问题,大家看看,谢谢

[复制链接]
发表于 2015-6-9 13:03:50 | 显示全部楼层 |阅读模式
5鱼币
#include <iostream>
using namespace std;
#include <string>
using namespace std;


struct Data
{
        string str;
};

struct Node
{
        Data data;
        Node * NextNode;
};

bool Init_Node(Node * & e)
{
        e=(Node *)malloc (sizeof( Node));
        if (e==NULL)
                return false;
        else
        return true;
};

void main()
{

                Node E;
        cin>>E.data.str;
        cout<<E.data.str;
        
        //这里可以///////////////////////

        Node * e;
        e=NULL;
        if(Init_Node( e))
        {
                cout<<e;
        cin>>e->data.str;        //这里为什么会崩溃
        cout<<e->data.str;
        }
}



不要动态分配
就用 Node * e;
cin>>e->data.str;
就会崩溃

最佳答案

查看完整内容

struct Data { string str; }; struct Node { Data data; Node * NextNode; }; bool Init_Node(Node * & e) { //e=(Node *)malloc (sizeof( Node)); e = new Node; if (e==NULL) return false; else return true; }; void main() { Node * e; e=NULL; if(Init_Node( e)) { coute->data.str; cout
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-9 13:03:51 | 显示全部楼层
本帖最后由 ryxcaixia 于 2015-6-9 13:36 编辑

struct Data
{
        string str;
};

struct Node
{
        Data data;
        Node * NextNode;
};

bool Init_Node(Node * & e)
{
//e=(Node *)malloc (sizeof( Node));
        e = new Node;

        if (e==NULL)
                return false;
        else
                return true;
};

void main()
{


        Node * e;
        e=NULL;
        if(Init_Node( e))
        {
                cout<<e;
                cin>>e->data.str;      
                cout<<e->data.str;
        }
}
主要原因是并没有对string类型进行初始化就直接使用
楼主不要着急说不是已经malloc了么, 往下看
1. string是一个类, 并不是基础类型, 他有自己的构造函数和析构函数, 静态定义变量就不说了, 动态变量为什么不成功?因为他的构造函数没有执行起来

2. malloc和new的区别
具体可以看看林锐的高质量c和c++编程有一章节专讲这个, 这里我简单说说(其实他书上说的也就是我说的这些)
如果除了malloc返回一个void*, 和new会自动只能返回申请类型外
最大的一个区别是
malloc仅仅申请sizeof()大小的内存块, 然后就什么都不管了
new则会依次执行结构体(类)内的每一个成员的构造函数, 换句话说, 如果都是内置类型的变量, 那么malloc和new没啥太大差别
但是包含了非基础类型, 那么申请内存就要用new, 因为malloc不会帮你执行构造函数但是new会
举个例子
struct student
{
        string Name;
        string Number;
        string Age;
        string Class;
        string EnjoyGame
        string GirlFriend;
        string GirlFriendName;
        string GirlFriendNumber;
        string GirlFriendAge;
        string GirlFriendClass;
        string GirlFriendEnjoyGame
};

一个结构体, 里面包含十个string类型
malloc一下仅仅会得到一个内存大小为360字节的内存堆(一个string站36个字节), 然后malloc就撒手不管了

new一下, 先是得到了360字节的内存块, 然后会依次执行十次string类的构造函数

同理, 释放的时候不能用free, free一下是把这个指针指向的内存干掉了, 但是里面的很多东西并没有清理干净
此时要用delete释放, 一次delete, 则会依次执行10次string类的析构函数

ps: 楼主又是你哈! 我又来骗鱼币了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-6-9 13:37:45 | 显示全部楼层
ryxcaixia 发表于 2015-6-9 13:29
struct Data
{
        string str;

高,实在是高;哈哈;我慢慢深入;
你还记得我;哈哈
我也是说怎么又是你;
只有你回复:handshake
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-6-9 13:39:13 | 显示全部楼层
ryxcaixia 发表于 2015-6-9 13:03
struct Data
{
        string str;

想要鱼币,我多的是,以后慢慢给你,哈:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-9 13:53:22 | 显示全部楼层
:lol:C/C++ 语法复杂 博大精深 一起努力
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-6-9 16:31:20 | 显示全部楼层
ryxcaixia 发表于 2015-6-9 13:53
C/C++ 语法复杂 博大精深 一起努力

我加你好友了,接受一下呗:big
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-9 16:43:21 | 显示全部楼层
Miracle-s 发表于 2015-6-9 16:31
我加你好友了,接受一下呗

我也想啊 但是! 说权限不够 努力签到中 要到下一级别才可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-6-9 18:27:32 | 显示全部楼层
ryxcaixia 发表于 2015-6-9 16:43
我也想啊 但是! 说权限不够 努力签到中 要到下一级别才可以

努力吧,我是个bug,:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 01:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表