cuibaowenown2 发表于 2014-4-12 00:45:43

魔术师发牌问题------运行时提示“Windows 已在 魔术师发牌问题.exe 中触发一个断点“

题目:
我的代码:(用的是只含尾指针的循环链表)#include <stdio.h>
#include <stdlib.h>

#define N 13

struct LinkList
{
      int n;
      LinkList *next;
}*rear;

void CreateChain()
{
      LinkList *p=rear=(LinkList*)malloc(sizeof(LinkList));
      for (int i=1;i<=N;i++)
      {
                p->next=(LinkList*)malloc(sizeof(LinkList));
                p=p->next;
                p->n=i;
      }
      p->next=rear->next;
      rear->next=p;
}

int main()
{
      CreateChain();
      LinkList *p1=rear->next,               
               *p2;                        //删除指针时用
      int n;
      for (int i=1;i<=N;i++)
      {
                n=i;
                while (--n)                // 指针走到该到的位置
                        p1=p1->next;
                printf("黑桃%d放在第%d张\n",i,p1->next->n);
                p2=p1->next->next;
                //printf("删除了%d\n",p1->next->n);//测试是否正确删除结点
                free(p1->next);
                p1->next=NULL;
                p1->next=p2;
      }
      free(rear);
      system("pause");
      return 0;
}编译器:VS2010
运行时错误为:
Windows 已在 魔术师发牌问题.exe 中触发一个断点。

其原因可能是堆被损坏,这说明 魔术师发牌问题.exe 中或它所加载的任何 DLL 中有 Bug。

原因也可能是用户在 魔术师发牌问题.exe 具有焦点时按下了 F12。

输出窗口可能提供了更多诊断信息。

截图如下:

求解为毛??????

向往青莲 发表于 2014-4-12 11:33:19

#include <stdio.h>
#include <stdlib.h>

#define N 13

struct LinkList
{
        int n;
        LinkList *next;
}*rear;

void CreateChain()
{
        LinkList *p=rear=(LinkList*)malloc(sizeof(LinkList));
        for (int i=1;i<=N;i++)
        {
                p->next=(LinkList*)malloc(sizeof(LinkList));
                p=p->next;
                p->n=i;
        }
        p->next=rear->next;
        rear->next=p;
}

int main()
{
        CreateChain();
        LinkList *p1=rear->next,               
                *p2;                        //删除指针时用
        int n;
        for (int i=1;i<=N;i++)
        {
                n=i;
                while (--n)                // 指针走到该到的位置
                        p1=p1->next;
                printf("黑桃%d放在第%d张\n",i,p1->next->n);
                p2=p1->next->next;
                //printf("删除了%d\n",p1->next->n);//测试是否正确删除结点
                /*free(p1->next);        */
//这里必须要注释掉。。因为你下面又用了free(rear)
//如果不注释掉的话。。就会重复free了。。那么堆肯定要出错了
                p1->next=NULL;
                p1->next=p2;
        }
        free(rear);
        system("pause");
        return 0;
}free(p1->next);把这个注释掉就不会堆报错了。。。

kangkaisen 发表于 2014-4-12 18:02:22

源代码在codeblocks 中运行没有任何错误,可以输出结果。去掉free()函数后,输出也是正确的。
输出结果可以看 附图。

建议运行小程序不要使用VS,不仅是大材小用,而且的确是会出现一些意想不到的的错误。

关于malloc 和free函数的原理 可以参看 csdn的这篇文章:http://blog.csdn.net/llhyy17/article/details/5375298

cuibaowenown2 发表于 2014-4-12 23:00:34

向往青莲 发表于 2014-4-12 11:33 static/image/common/back.gif
free(p1->next);把这个注释掉就不会堆报错了。。。

你把注释去掉,就知道我没有重复删除

cuibaowenown2 发表于 2014-4-12 23:01:13

kangkaisen 发表于 2014-4-12 18:02 static/image/common/back.gif
源代码在codeblocks 中运行没有任何错误,可以输出结果。去掉free()函数后,输出也是正确的。
输出结果可以 ...

这位兄台,如果VS连运行小程序都出错,大程序还能运行?你这样的想法我觉得是不对的

牡丹花下死做鬼 发表于 2014-4-13 01:11:56

←_← 话说我在VS2013下50多个错误的说

cuibaowenown2 发表于 2014-4-13 06:20:56

牡丹花下死做鬼 发表于 2014-4-13 01:11 static/image/common/back.gif
←_← 话说我在VS2013下50多个错误的说

2013我也用过,那个不好用,比如你用printf的话会很多warning,它让你用微软新加的函数

牡丹花下死做鬼 发表于 2014-4-13 06:50:01

cuibaowenown2 发表于 2014-4-13 06:20 static/image/common/back.gif
2013我也用过,那个不好用,比如你用printf的话会很多warning,它让你用微软新加的函数

早晚得适应新函数啊 C11标准以及有了 总不能一直沉迷于VC++6.0吧

cuibaowenown2 发表于 2014-4-13 17:51:39

没人知道么?那我就当VS误报了

黑暗漩涡 发表于 2014-8-15 12:24:12

回帖是一种美德

黄志伟 发表于 2014-10-13 12:10:32


谁能告诉我小甲鱼的数据第43讲为什么不能下载

cuibaowenown2 发表于 2014-10-14 21:53:55

黄志伟 发表于 2014-10-13 12:10
谁能告诉我小甲鱼的数据第43讲为什么不能下载

我也不知道啊

蚯蚓翔龙 发表于 2014-10-15 07:32:36

{:1_1:}不知道,帮顶吧
页: [1]
查看完整版本: 魔术师发牌问题------运行时提示“Windows 已在 魔术师发牌问题.exe 中触发一个断点“