为啥我写的链表老是报错
编译器没报错,老是操作系统报错,什么内存不能为read{:10_269:}{:10_269:}写错了还是怎么了,每次写的链表都这样,搞不懂 链表涉及到指针的灵活运用,稍有不慎,就会导致系统异常,所以要先学好指针和单步调试 贴出代码来看看 BngThea 发表于 2017-12-18 12:28
链表涉及到指针的灵活运用,稍有不慎,就会导致系统异常,所以要先学好指针和单步调试
感觉也没有呀编译器都不报错,有时也可以运行一会,等你多输入几个数据操作系统就报错了。。。
人造人 发表于 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;
}
这个是链表部分 程序就是运行到了链表这就异常了 wjp 发表于 2017-12-18 20:37
感觉也没有呀编译器都不报错,有时也可以运行一会,等你多输入几个数据操作系统就报错了。。。
那就是指针越界导致的,还是可以单步调试得到具体问题的 BngThea 发表于 2017-12-18 21:25
那就是指针越界导致的,还是可以单步调试得到具体问题的
vc6.0 调试不了呀 下了断点没反应{:10_266:}还是因为我不会弄{:10_266:} 这里if(h==NULL)
h=m;应该是n不是h 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
sp1ral 发表于 2017-12-19 09:27
strcpy(m->name,mz);
printf("电话:");
gets(m->dianhua);
fprintf放在if(h=NULL)前面吗 ?这里不是链表还没用数据吗?
sp1ral 发表于 2017-12-19 09:18
这里if(h==NULL)
h=m;应该是n不是h
为啥?h我把它设为头指针第一个分配出的地址不应该给它吗
sp1ral 发表于 2017-12-19 09:27
strcpy(m->name,mz);
printf("电话:");
gets(m->dianhua);
codeblocks哪里有下呀我的是xp系统有点老了{:10_266:}太高版本的用不了呀{:10_266:} 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) while(gets(mz)!=NULL)这是个死循环 这是我写的 一个链表;
处理的是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;
} sp1ral 发表于 2017-12-20 12:19
codeblocks这里http://blog.fishc.com/601.html
是我没有看清楚struct filme* h=NULL,*m,*n;
这里你定义 ...
懂了,谢谢,n->p先初始化再赋值,释放内存循环写错了,freez(m)之后是不是m就为空了,循环结束了是吧 新建word 发表于 2017-12-20 18:46
这是我写的 一个链表;
处理的是json数据转链表,
代码比较简陋,临时写的 应急用的;
看不懂{:10_266:}{:10_266:} wjp 发表于 2017-12-21 11:06
看不懂
Json_Insert 你把这个函数搞明白了就行了,read 那个函数 是我处理json 数据的硬编码 没毛用的!
页:
[1]