鱼C论坛

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

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

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

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

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

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

  3. using namespace std;

  4. struct DNode
  5. {
  6.         string data;        
  7.         DNode* next;
  8.         DNode* piror;
  9. };

  10. void Creat_DNode(DNode**);

  11. int main()
  12. {
  13.         DNode *L;
  14.         Creat_DNode(&L);
  15.         system("pause");
  16.         return 0;
  17. }

  18. void Creat_DNode(DNode **L)
  19. {
  20.         string ss;
  21.        
  22.         DNode *p, *r;
  23.         *L = (DNode*)malloc(sizeof(DNode));
  24.         p = r = *L;
  25.         cout << "please insert string" << endl;
  26.         getline(cin, p->data);
  27.         p->next = p->piror = *L;
  28.         if (p->data == "")           
  29.         {
  30.                 return;
  31.         }
  32.         while(1)
  33.         {
  34.                 cout << "please insert string:" << endl;
  35.                 getline(cin, ss);
  36.                 if (ss == "")
  37.                 {
  38.                         break;
  39.                 }
  40.                 else
  41.                 {
  42.                         p = (DNode*)malloc(sizeof(DNode));
  43.                         p->data = ss;
  44.                         p->next = *L;
  45.                         (*L)->piror = p;
  46.                         p->piror = r;
  47.                         r->next = p;
  48.                         r = p;
  49.                 }
  50.         }
  51.         r = *L;
  52.         do
  53.         {
  54.                 cout << " " << r->data << " ";
  55.                 r = r->next;
  56.         } while (r->next!=(*L)->next);
  57.         cout << endl;

  58. }
复制代码


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

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

_Left 是 0xCDCDCDCD。

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

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

  3. using namespace std;

  4. struct DNode
  5. {
  6.         int data;                         //修改点
  7.         DNode* next;
  8.         DNode* piror;
  9. };

  10. void Creat_DNode(DNode**);

  11. int main()
  12. {
  13.         DNode *L;
  14.         Creat_DNode(&L);
  15.         system("pause");
  16.         return 0;
  17. }

  18. void Creat_DNode(DNode **L)
  19. {
  20.         int ss;                              //修改点
  21.        
  22.         DNode *p, *r;
  23.         *L = (DNode*)malloc(sizeof(DNode));
  24.         p = r = *L;
  25.         cout << "please insert string" << endl;
  26.         cin >> p->data;                             //修改点
  27.         p->next = p->piror = *L;
  28.         if (p->data == 0)                    //修改点
  29.         {
  30.                 return;
  31.         }
  32.         while(1)
  33.         {
  34.                 cout << "please insert string:" << endl;
  35.                 cin >> ss;                     //修改点
  36.                 if (ss == 0)                  //修改点
  37.                 {
  38.                         break;
  39.                 }
  40.                 else
  41.                 {
  42.                         p = (DNode*)malloc(sizeof(DNode));
  43.                         p->data = ss;
  44.                         p->next = *L;
  45.                         (*L)->piror = p;
  46.                         p->piror = r;
  47.                         r->next = p;
  48.                         r = p;
  49.                 }
  50.         }
  51.         r = *L;
  52.         do
  53.         {
  54.                 cout << " " << r->data << " ";
  55.                 r = r->next;
  56.         } while (r->next!=(*L)->next);
  57.         cout << endl;

  58. }
复制代码



完全没有头绪啊。这是在搞毛啊。
求助。心已累。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2016-4-12 06:44:22 | 显示全部楼层
有道理哦,我用char* 的类型也试了一下,也出现了同样的问题。
小甲鱼最新课程 -> https://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会调用相应类的构造函数完成初始化。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

大神啊,好崇拜你。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

好了,运行成功。让我崇拜你吧。看来我对C++的理解还不深啊。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-22 12:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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