鱼C论坛

 找回密码
 立即注册
查看: 2132|回复: 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数据转链表,
代码比较简陋,临时写的 应急用的;
链表简单点的回答就是一个结构体 ,
储存完数据 初始化下一个结构体 ,将下一个结构体的内存地址放到当前结构体中。


typedef struct _json 
{
    char * Json_name;//数据名称
    char * Json_buf;//数据
    UINT name_len;
    UINT buf_len;
    _json * next;
    UINT num;
}Json;
Json * Json_Insert(Json * json,char * name,int name_len,char * buf,int buf_len)
{
    if (name)
    {
        json->Json_name=(char *)malloc(name_len + 1);
        ZeroMemory(json->Json_name,name_len + 1);
        MoveMemory(json->Json_name,name,name_len);
        json->name_len=name_len;
    }
    else 
    {
        json->Json_name=NULL;
        json->name_len=0;
    }
    if (buf)
    {
        json->Json_buf=(char *)malloc(buf_len + 1);
        ZeroMemory(json->Json_buf,buf_len + 1);
        MoveMemory(json->Json_buf,buf,buf_len);
        json->buf_len=buf_len;
    }else
    {
        json->Json_buf=NULL;
        json->buf_len=0;
    }
    json->next=new Json;
    json=json->next;
    json->next=NULL;//将下一个链表的next 指向 NULL
    return json;
}
Json * Json_read(char * buf_temp)
{
    char * buf=buf_temp , *m_buf =buf;
    Json * json=new Json, *m_json=json;
    char * Json_name=NULL,*Json_buf=NULL;
    char *start =NULL,*end=NULL;
    int name_len =0,buf_len =0;
    while (*m_buf)//遍历内存;
    {
        switch(*m_buf)
        {
        case '"'://引号 是name 或 汉字的buf
            ++m_buf;
            if (*m_buf == ':')
                end=m_buf -1;
            else if(!start)//必须为空
                start=m_buf -1;
            --m_buf;
            break;
        case ',':
            if (start && end)
            {
                name_len = end -start;
                Json_name=(char *)malloc(name_len);
                ZeroMemory(Json_name,name_len);
                MoveMemory(Json_name,start + 1,name_len - 1);
                buf_len=m_buf-end - 1;
                Json_buf=(char *)malloc(buf_len);
                ZeroMemory(Json_buf,buf_len);
                MoveMemory(Json_buf,end + 2,buf_len -1);
                m_json=Json_Insert(m_json,Json_name,name_len -1,Json_buf,buf_len - 1);
                free(Json_name),free(Json_buf);//清理
                start=NULL,end=NULL;
            }
        case '{'://类开始
            if (start && end)
            {
                name_len = end -start;
                Json_name=(char *)malloc(name_len);
                ZeroMemory(Json_name,name_len);
                MoveMemory(Json_name,start + 1,name_len - 1);
                m_json=Json_Insert(m_json,Json_name,name_len -1,NULL,0);
                free(Json_name);//清理
                start=NULL,end=NULL;
            }
            break;
        case '}'://类结束;
            if (start && end)
            {
                name_len = end -start;
                Json_name=(char *)malloc(name_len);
                ZeroMemory(Json_name,name_len);
                MoveMemory(Json_name,start + 1,name_len - 1);
                buf_len=m_buf-end - 1;
                Json_buf=(char *)malloc(buf_len);
                ZeroMemory(Json_buf,buf_len);
                MoveMemory(Json_buf,end + 2,buf_len -1);
                m_json=Json_Insert(m_json,Json_name,name_len -1,Json_buf,buf_len - 1);
                free(Json_name),free(Json_buf);//清理
                start=NULL,end=NULL;
            }
            break;
        }
        ++m_buf;
    }
    /*
    while (json->next)
    {
        if (json->Json_buf)
        {
            MessageBoxA(NULL,json->Json_buf,json->Json_name,MB_OK);
        }else
            MessageBoxA(NULL,json->Json_name,"类名",MB_OK);
        json =json->next;
    }*/
    return json;
}
想知道小甲鱼最近在做啥?请访问 -> 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-10-1 05:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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