鱼C论坛

 找回密码
 立即注册
查看: 1961|回复: 17

[已解决]为啥我写的链表老是报错

[复制链接]
发表于 2017-12-18 09:56:06 From FishC Mobile | 显示全部楼层 |阅读模式

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

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

x
编译器没报错,老是操作系统报错,什么内存不能为read
写错了还是怎么了,每次写的链表都这样,搞不懂
最佳答案
2017-12-20 12:19:54
codeblocks这里http://blog.fishc.com/601.html
是我没有看清楚struct filme* h=NULL,*m,*n;
这里你定义的h应该是指头节点把
strcpy(m->name,mz);
          printf("电话:");
                  gets(m->dianhua);
m->p = NULL; //这里要将指针p为空指针
放if前是先将表元素放入m,然后判断头结点是否为空,
为空将m的给头结点
不为空
{
        n->p=m;
                 //这里要放在if前初始化的时候 m->p=NULL;
}
然后 把n = m;

while(m!=NULL)
        {
                m=h;
            h=m->p;
                free(m); //这里释放了m 这个循环会出错
        }
m = h;
do
{
n = m ->p;
free(m);
m = n;

}while(n->p != NULL)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-18 12:28:27 From FishC Mobile | 显示全部楼层
链表涉及到指针的灵活运用,稍有不慎,就会导致系统异常,所以要先学好指针和单步调试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-18 13:29:35 | 显示全部楼层
贴出代码来看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-18 20:37:41 | 显示全部楼层
BngThea 发表于 2017-12-18 12:28
链表涉及到指针的灵活运用,稍有不慎,就会导致系统异常,所以要先学好指针和单步调试

感觉也没有呀  编译器都不报错,有时也可以运行一会,等你多输入几个数据操作系统就报错了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-18 20:41:47 | 显示全部楼层

struct filme{
                char name[20];
                char dianhua[20];
                struct filme* p;
        };
int main(int argc, char* argv[])
{
        FILE* fp;
    fp=fopen("txl.txt","wt");
        if(fp==NULL)
        {
                printf("程序出现错误请重试\n");
                exit(0);
        }
        char mz[20];
        struct filme* h=NULL,*m,*n;
        printf("姓名:");
        getchar();
    while(gets(mz)!=NULL)
        {
                if(mz[0]=='y')
                        return 0;
                m=(struct filme*)malloc(sizeof(struct filme));
                  if(h==NULL)
                         h=m;
                  else
                         n->p=m;
                  m->p=NULL;
                  strcpy(m->name,mz);
          printf("电话:");
                  gets(m->dianhua);
                  fprintf(fp,"%s%s",m->name,m->dianhua);
                  n=m;
          printf("姓名:");
        }
        m=h;
        while(m!=NULL)
        {
                m=h;
            h=m->p;
                free(m);
        }
    fclose(fp);
        return 0;
}
这个是链表部分 程序就是运行到了链表这就异常了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-18 21:25:20 From FishC Mobile | 显示全部楼层
wjp 发表于 2017-12-18 20:37
感觉也没有呀  编译器都不报错,有时也可以运行一会,等你多输入几个数据操作系统就报错了。。。

那就是指针越界导致的,还是可以单步调试得到具体问题的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-18 22:45:03 | 显示全部楼层
BngThea 发表于 2017-12-18 21:25
那就是指针越界导致的,还是可以单步调试得到具体问题的

vc6.0 调试不了呀 下了断点没反应还是因为我不会弄
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-19 09:18:16 From FishC Mobile | 显示全部楼层
这里if(h==NULL)
                         h=m;应该是n不是h
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-19 09:27:23 From FishC Mobile | 显示全部楼层
strcpy(m->name,mz);
          printf("电话:");
                  gets(m->dianhua);
                  fprintf(fp,"%s%s",m->name,m->dianhua);放到if语句前面

n->p=m;
                  m->p=NULL;两句加{}

vc6.0在win7 win10下运行调试可能会有问题
建议使用其他软件比如codeblocks
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-19 22:37:53 | 显示全部楼层
sp1ral 发表于 2017-12-19 09:27
strcpy(m->name,mz);
          printf("电话:");
                  gets(m->dianhua);

fprintf放在if(h=NULL)前面吗 ?这里不是链表还没用数据吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-19 22:38:56 | 显示全部楼层
sp1ral 发表于 2017-12-19 09:18
这里if(h==NULL)
                         h=m;应该是n不是h

为啥?h我把它设为头指针第一个分配出的地址不应该给它吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-19 22:40:31 | 显示全部楼层
sp1ral 发表于 2017-12-19 09:27
strcpy(m->name,mz);
          printf("电话:");
                  gets(m->dianhua);

codeblocks哪里有下呀  我的是xp系统  有点老了太高版本的用不了呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-20 12:19:54 | 显示全部楼层    本楼为最佳答案   
codeblocks这里http://blog.fishc.com/601.html
是我没有看清楚struct filme* h=NULL,*m,*n;
这里你定义的h应该是指头节点把
strcpy(m->name,mz);
          printf("电话:");
                  gets(m->dianhua);
m->p = NULL; //这里要将指针p为空指针
放if前是先将表元素放入m,然后判断头结点是否为空,
为空将m的给头结点
不为空
{
        n->p=m;
                 //这里要放在if前初始化的时候 m->p=NULL;
}
然后 把n = m;

while(m!=NULL)
        {
                m=h;
            h=m->p;
                free(m); //这里释放了m 这个循环会出错
        }
m = h;
do
{
n = m ->p;
free(m);
m = n;

}while(n->p != NULL)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-20 13:40:19 From FishC Mobile | 显示全部楼层
while(gets(mz)!=NULL)这是个死循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-20 18:46:55 | 显示全部楼层
这是我写的 一个链表;
处理的是json数据转链表,
代码比较简陋,临时写的 应急用的;
链表简单点的回答就是一个结构体 ,
储存完数据 初始化下一个结构体 ,将下一个结构体的内存地址放到当前结构体中。



  1. typedef struct _json
  2. {
  3.     char * Json_name;//数据名称
  4.     char * Json_buf;//数据
  5.     UINT name_len;
  6.     UINT buf_len;
  7.     _json * next;
  8.     UINT num;
  9. }Json;
  10. Json * Json_Insert(Json * json,char * name,int name_len,char * buf,int buf_len)
  11. {
  12.     if (name)
  13.     {
  14.         json->Json_name=(char *)malloc(name_len + 1);
  15.         ZeroMemory(json->Json_name,name_len + 1);
  16.         MoveMemory(json->Json_name,name,name_len);
  17.         json->name_len=name_len;
  18.     }
  19.     else
  20.     {
  21.         json->Json_name=NULL;
  22.         json->name_len=0;
  23.     }
  24.     if (buf)
  25.     {
  26.         json->Json_buf=(char *)malloc(buf_len + 1);
  27.         ZeroMemory(json->Json_buf,buf_len + 1);
  28.         MoveMemory(json->Json_buf,buf,buf_len);
  29.         json->buf_len=buf_len;
  30.     }else
  31.     {
  32.         json->Json_buf=NULL;
  33.         json->buf_len=0;
  34.     }
  35.     json->next=new Json;
  36.     json=json->next;
  37.     json->next=NULL;//将下一个链表的next 指向 NULL
  38.     return json;
  39. }
  40. Json * Json_read(char * buf_temp)
  41. {
  42.     char * buf=buf_temp , *m_buf =buf;
  43.     Json * json=new Json, *m_json=json;
  44.     char * Json_name=NULL,*Json_buf=NULL;
  45.     char *start =NULL,*end=NULL;
  46.     int name_len =0,buf_len =0;
  47.     while (*m_buf)//遍历内存;
  48.     {
  49.         switch(*m_buf)
  50.         {
  51.         case '"'://引号 是name 或 汉字的buf
  52.             ++m_buf;
  53.             if (*m_buf == ':')
  54.                 end=m_buf -1;
  55.             else if(!start)//必须为空
  56.                 start=m_buf -1;
  57.             --m_buf;
  58.             break;
  59.         case ',':
  60.             if (start && end)
  61.             {
  62.                 name_len = end -start;
  63.                 Json_name=(char *)malloc(name_len);
  64.                 ZeroMemory(Json_name,name_len);
  65.                 MoveMemory(Json_name,start + 1,name_len - 1);
  66.                 buf_len=m_buf-end - 1;
  67.                 Json_buf=(char *)malloc(buf_len);
  68.                 ZeroMemory(Json_buf,buf_len);
  69.                 MoveMemory(Json_buf,end + 2,buf_len -1);
  70.                 m_json=Json_Insert(m_json,Json_name,name_len -1,Json_buf,buf_len - 1);
  71.                 free(Json_name),free(Json_buf);//清理
  72.                 start=NULL,end=NULL;
  73.             }
  74.         case '{'://类开始
  75.             if (start && end)
  76.             {
  77.                 name_len = end -start;
  78.                 Json_name=(char *)malloc(name_len);
  79.                 ZeroMemory(Json_name,name_len);
  80.                 MoveMemory(Json_name,start + 1,name_len - 1);
  81.                 m_json=Json_Insert(m_json,Json_name,name_len -1,NULL,0);
  82.                 free(Json_name);//清理
  83.                 start=NULL,end=NULL;
  84.             }
  85.             break;
  86.         case '}'://类结束;
  87.             if (start && end)
  88.             {
  89.                 name_len = end -start;
  90.                 Json_name=(char *)malloc(name_len);
  91.                 ZeroMemory(Json_name,name_len);
  92.                 MoveMemory(Json_name,start + 1,name_len - 1);
  93.                 buf_len=m_buf-end - 1;
  94.                 Json_buf=(char *)malloc(buf_len);
  95.                 ZeroMemory(Json_buf,buf_len);
  96.                 MoveMemory(Json_buf,end + 2,buf_len -1);
  97.                 m_json=Json_Insert(m_json,Json_name,name_len -1,Json_buf,buf_len - 1);
  98.                 free(Json_name),free(Json_buf);//清理
  99.                 start=NULL,end=NULL;
  100.             }
  101.             break;
  102.         }
  103.         ++m_buf;
  104.     }
  105.     /*
  106.     while (json->next)
  107.     {
  108.         if (json->Json_buf)
  109.         {
  110.             MessageBoxA(NULL,json->Json_buf,json->Json_name,MB_OK);
  111.         }else
  112.             MessageBoxA(NULL,json->Json_name,"类名",MB_OK);
  113.         json =json->next;
  114.     }*/
  115.     return json;
  116. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-21 10:54:55 From FishC Mobile | 显示全部楼层
sp1ral 发表于 2017-12-20 12:19
codeblocks这里http://blog.fishc.com/601.html
是我没有看清楚struct filme* h=NULL,*m,*n;
这里你定义 ...

懂了,谢谢,n->p先初始化再赋值,释放内存循环写错了,freez(m)之后是不是m就为空了,循环结束了是吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-21 11:06:26 From FishC Mobile | 显示全部楼层
新建word 发表于 2017-12-20 18:46
这是我写的 一个链表;
处理的是json数据转链表,
代码比较简陋,临时写的 应急用的;

看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-22 23:03:22 | 显示全部楼层

Json_Insert   你把这个函数搞明白了就行了,  read 那个函数 是我处理  json 数据的硬编码 没毛用的!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 10:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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