鱼C论坛

 找回密码
 立即注册
查看: 34857|回复: 5

为什么会出现“ 写入访问权限冲突”?

[复制链接]
发表于 2016-4-11 21:48:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我的源码如下
#include <iostream>
#include <string>

using namespace std;

struct DNode
{
        string data;        
        DNode* next;
        DNode* piror;
};

void Creat_DNode(DNode**);

int main()
{
        DNode *L;
        Creat_DNode(&L);
        system("pause");
        return 0;
}

void Creat_DNode(DNode **L)
{
        string ss; 
        
        DNode *p, *r;
        *L = (DNode*)malloc(sizeof(DNode));
        p = r = *L;
        cout << "please insert string" << endl;
        getline(cin, p->data);
        p->next = p->piror = *L;
        if (p->data == "")           
        {
                return;
        }
        while(1)
        {
                cout << "please insert string:" << endl;
                getline(cin, ss);
                if (ss == "")
                {
                        break;
                }
                else
                {
                        p = (DNode*)malloc(sizeof(DNode));
                        p->data = ss;
                        p->next = *L;
                        (*L)->piror = p;
                        p->piror = r;
                        r->next = p;
                        r = p;
                }
        }
        r = *L;
        do
        {
                cout << " " << r->data << " ";
                r = r->next;
        } while (r->next!=(*L)->next);
        cout << endl;

}

这个程序的作用是创建一个双向循环链表。其中的Node结构的data字段用来储存string类的字符串。
但是我在调试运行的时候总是提示我

“引发了异常: 写入访问权限冲突。

_Left 是 0xCDCDCDCD。

如有适用于此异常的处理程序,该程序便可安全地继续运行。”

如果我把data类型改成数字,并对程序做相应的修改,运行就完全没有问题。请看如下程序。
#include <iostream>
#include <string>

using namespace std;

struct DNode
{
        int data;                         //修改点
        DNode* next;
        DNode* piror;
};

void Creat_DNode(DNode**);

int main()
{
        DNode *L;
        Creat_DNode(&L);
        system("pause");
        return 0;
}

void Creat_DNode(DNode **L)
{
        int ss;                              //修改点
        
        DNode *p, *r;
        *L = (DNode*)malloc(sizeof(DNode));
        p = r = *L;
        cout << "please insert string" << endl;
        cin >> p->data;                             //修改点
        p->next = p->piror = *L;
        if (p->data == 0)                    //修改点
        {
                return;
        }
        while(1)
        {
                cout << "please insert string:" << endl;
                cin >> ss;                     //修改点
                if (ss == 0)                  //修改点
                {
                        break;
                }
                else
                {
                        p = (DNode*)malloc(sizeof(DNode));
                        p->data = ss;
                        p->next = *L;
                        (*L)->piror = p;
                        p->piror = r;
                        r->next = p;
                        r = p;
                }
        }
        r = *L;
        do
        {
                cout << " " << r->data << " ";
                r = r->next;
        } while (r->next!=(*L)->next);
        cout << endl;

}


完全没有头绪啊。这是在搞毛啊。
求助。心已累。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-12 00:39:11 | 显示全部楼层
string类型不是会自动申请空间的吗?链表节点也需要申请空间。是不是这个原因?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-12 06:44:22 | 显示全部楼层
有道理哦,我用char* 的类型也试了一下,也出现了同样的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-12 08:32:34 | 显示全部楼层
malloc只是分配内存,并不进行初始化,不调用类的构造函数,所以当以下这两处调用发生的时候,都会出现错误
getline(cin, p->data); 还有
     p = (DNode*)malloc(sizeof(DNode));
                        p->data = ss;
都是因为string对象的构造函数没有被调用,没有构建string对象。所以,getline函数无法调用string对象进行赋值,同样,date也无法完成赋值。
同理,你修改后的程序,因为使用的是int类型替代string类型,所以没有上面说的情况发生,所以可以运行。

解决办法,用new代替malloc,
  p = new(DNode);
new会调用相应类的构造函数完成初始化。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-12 18:14:19 | 显示全部楼层
muyu0096 发表于 2016-4-12 08:32
malloc只是分配内存,并不进行初始化,不调用类的构造函数,所以当以下这两处调用发生的时候,都会出现错误 ...

大神啊,好崇拜你。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-12 18:47:50 | 显示全部楼层
截图.png

好了,运行成功。让我崇拜你吧。看来我对C++的理解还不深啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-2 23:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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