- 论坛徽章:
- 0
|
回复 15# dxyf1524
谢谢你..
我重新修改了下代码,
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX_ADDR_LEN 128
#define MAX_LINE_LEN 512
#define pError(x) printf("%s\n",x);
#define tfree(x) { if ( x ) { free(x); x = NULL; } }
typedef struct vCard_unique_name_addr
{
char name[MAX_LINE_LEN];
char addr[MAX_ADDR_LEN];
struct vCard_unique_name_addr* pNext;
}vCard_uni_nam_adr;
static void uni_name_adr_tmp_listfree(vCard_uni_nam_adr ** puni_name_adr)
{
vCard_uni_nam_adr * pTmpuni_nam_adr_pos = NULL;
vCard_uni_nam_adr * pTmpuni_nam_adr_next = NULL;
if(NULL == *puni_name_adr)
{
return ;
}
pTmpuni_nam_adr_pos = *puni_name_adr;
for(;pTmpuni_nam_adr_pos != NULL;pTmpuni_nam_adr_pos = pTmpuni_nam_adr_next){
pTmpuni_nam_adr_next = pTmpuni_nam_adr_pos->pNext;
tfree(pTmpuni_nam_adr_pos);
}
*puni_name_adr =NULL;
return;
}
static int check_distinct_nam_adr(vCard_uni_nam_adr ** pTmpuni_nam_adr_head , const char *name, const char * addr){
vCard_uni_nam_adr * pTmpuni_nam_adr_next = NULL;
vCard_uni_nam_adr * pTmpuni_nam_adr_pos = NULL;
pTmpuni_nam_adr_pos = *pTmpuni_nam_adr_head ;
while(pTmpuni_nam_adr_pos != NULL){
if( strcmp(pTmpuni_nam_adr_pos->name,name)==0 && strcmp(pTmpuni_nam_adr_pos->addr,addr)==0 ){
return 1;
}
pTmpuni_nam_adr_next = pTmpuni_nam_adr_pos;
pTmpuni_nam_adr_pos = pTmpuni_nam_adr_pos->pNext;
}
pTmpuni_nam_adr_pos = (vCard_uni_nam_adr*)malloc(sizeof(vCard_uni_nam_adr));
if(NULL == pTmpuni_nam_adr_pos)
{
pError("Get memory failure while distinct vcard info");
uni_name_adr_tmp_listfree(pTmpuni_nam_adr_head);
}
else
{
memset(pTmpuni_nam_adr_pos,0,sizeof(vCard_uni_nam_adr));
pTmpuni_nam_adr_pos->pNext = NULL;
strcpy(pTmpuni_nam_adr_pos->name,name ? name : "null");
strcpy(pTmpuni_nam_adr_pos->addr,addr ? addr : "null");
if(NULL == *pTmpuni_nam_adr_head){
*pTmpuni_nam_adr_head = pTmpuni_nam_adr_pos;
}
else{
pTmpuni_nam_adr_next->pNext = pTmpuni_nam_adr_pos;
}
}
return 0;
}
int main(void){
vCard_uni_nam_adr * pTmpuni_nam_adr_head = NULL;
check_distinct_nam_adr(&pTmpuni_nam_adr_head,"nihao","188888");
check_distinct_nam_adr(&pTmpuni_nam_adr_head,"hello","55555");
check_distinct_nam_adr(&pTmpuni_nam_adr_head,"nihao","188888");
check_distinct_nam_adr(&pTmpuni_nam_adr_head,"hello","188888");
check_distinct_nam_adr(&pTmpuni_nam_adr_head,"qqqq","000000");
vCard_uni_nam_adr * pp = pTmpuni_nam_adr_head;
while(pp != NULL){
// sleep(1);
printf("name:%s,addr:%s\n",pp->name,pp->addr);
pp = pp->pNext;
}
printf("==================\n");
uni_name_adr_tmp_listfree(&pTmpuni_nam_adr_head);
vCard_uni_nam_adr *xp = pTmpuni_nam_adr_head;
while(xp != NULL){
// sleep(1);
printf("name:%s,addr:%s\n",xp->name,xp->addr);
xp = xp->pNext;
}
}
我发现一个问题 应该是在上面标红的地方, 我把pos指向了adr所指向的内容, 但是把pos指向的内容释放了并置null后, adr这个指针还是指向这个释放后的空间..所以再访问adr的时候,会出现段错误.
因此需要将adr这个指针也置null,这样就不会出错了..
不知道我这样理解的对不对... |
|