wjp 发表于 2017-12-18 09:56:06

为啥我写的链表老是报错

编译器没报错,老是操作系统报错,什么内存不能为read
{:10_269:}{:10_269:}写错了还是怎么了,每次写的链表都这样,搞不懂

BngThea 发表于 2017-12-18 12:28:27

链表涉及到指针的灵活运用,稍有不慎,就会导致系统异常,所以要先学好指针和单步调试

人造人 发表于 2017-12-18 13:29:35

贴出代码来看看

wjp 发表于 2017-12-18 20:37:41

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

感觉也没有呀编译器都不报错,有时也可以运行一会,等你多输入几个数据操作系统就报错了。。。

wjp 发表于 2017-12-18 20:41:47

人造人 发表于 2017-12-18 13:29
贴出代码来看看

struct filme{
                char name;
                char dianhua;
                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;
        struct filme* h=NULL,*m,*n;
        printf("姓名:");
        getchar();
    while(gets(mz)!=NULL)
        {
                if(mz=='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;
}
这个是链表部分 程序就是运行到了链表这就异常了

BngThea 发表于 2017-12-18 21:25:20

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

那就是指针越界导致的,还是可以单步调试得到具体问题的

wjp 发表于 2017-12-18 22:45:03

BngThea 发表于 2017-12-18 21:25
那就是指针越界导致的,还是可以单步调试得到具体问题的

vc6.0 调试不了呀 下了断点没反应{:10_266:}还是因为我不会弄{:10_266:}

sp1ral 发表于 2017-12-19 09:18:16

这里if(h==NULL)
                         h=m;应该是n不是h

sp1ral 发表于 2017-12-19 09:27:23

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

wjp 发表于 2017-12-19 22:37:53

sp1ral 发表于 2017-12-19 09:27
strcpy(m->name,mz);
          printf("电话:");
                  gets(m->dianhua);


fprintf放在if(h=NULL)前面吗 ?这里不是链表还没用数据吗?

wjp 发表于 2017-12-19 22:38:56

sp1ral 发表于 2017-12-19 09:18
这里if(h==NULL)
                         h=m;应该是n不是h

为啥?h我把它设为头指针第一个分配出的地址不应该给它吗

wjp 发表于 2017-12-19 22:40:31

sp1ral 发表于 2017-12-19 09:27
strcpy(m->name,mz);
          printf("电话:");
                  gets(m->dianhua);


codeblocks哪里有下呀我的是xp系统有点老了{:10_266:}太高版本的用不了呀{:10_266:}

sp1ral 发表于 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)

sp1ral 发表于 2017-12-20 13:40:19

while(gets(mz)!=NULL)这是个死循环

新建word 发表于 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;
}

wjp 发表于 2017-12-21 10:54:55

sp1ral 发表于 2017-12-20 12:19
codeblocks这里http://blog.fishc.com/601.html
是我没有看清楚struct filme* h=NULL,*m,*n;
这里你定义 ...

懂了,谢谢,n->p先初始化再赋值,释放内存循环写错了,freez(m)之后是不是m就为空了,循环结束了是吧

wjp 发表于 2017-12-21 11:06:26

新建word 发表于 2017-12-20 18:46
这是我写的 一个链表;
处理的是json数据转链表,
代码比较简陋,临时写的 应急用的;


看不懂{:10_266:}{:10_266:}

新建word 发表于 2017-12-22 23:03:22

wjp 发表于 2017-12-21 11:06
看不懂

Json_Insert   你把这个函数搞明白了就行了,read 那个函数 是我处理json 数据的硬编码 没毛用的!
页: [1]
查看完整版本: 为啥我写的链表老是报错