日期:2014-05-16  浏览次数:20766 次

malloc(): memory corruption问题
typedef struct tagKZXSEROUTS{
char zxserip[16];
int zxseroutch;
char zxserphone[10];
int zxserinch;
struct tagKZXSEROUTS *next;
} ZXSEROUTS;
int createZXSEROutchs(char *ip, int outch, char *phone)
{
ZXSEROUTS *pc, *tmppc;
printf("1111111,sizeof:%d\n", sizeof(ZXSEROUTS));
if ((pc = (ZXSEROUTS *)malloc(sizeof(ZXSEROUTS))) == NULL)
{
printf("22222222\n");
}
//pc = (ZXSEROUTS *)malloc(sizeof(ZXSEROUTS));
printf("33333333\n");
sprintf(pc->zxserip, "%s", ip);
pc->zxseroutch = outch;
pc->zxserinch = -1;
sprintf(pc->zxserphone, "%s", phone);
pc->next = NULL;
if (g_poutchhead)
{
tmppc = g_poutchhead;
while (tmppc->next)
{
tmppc = tmppc->next;
}
tmppc->next = pc;
}else
{
g_poutchhead = pc;
}
return 0;
}

==================
1111111,sizeof:40
33333333
33333333,,sizof:10
1111111,sizeof:40
*** glibc detected *** malloc(): memory corruption: 0x08287eb8 ***
忽略

开始的时候是可以运行的,后来因为需要在结点中加了一个变量(sprintf(pc->zxserphone, "%s", phone);)再执行就出现上面的问题了,我在网上也找过资料,但是没有明白。
网上基本上说是堆被破坏了,或free两次出现的问题,可是我没有进行free,也只是分配一下内存而以,为什么会出这个问题呢,另外只要把sprintf(pc->zxserphone, "%s", phone);注释,代码就就可以正常运行了,可是这行是必须的,我该怎么办呢?

------解决方案--------------------
33333333,,sizof:10 是哪里打出来的?
你每次把phone的值打出来看看,有没有可能超长了?我觉得就是因为phone超长(长度大于9)导致内存侵犯了。
------解决方案--------------------
phone字符串的长度大于10了。因为成员zxserphone的长度是10。如果你存个手机号,那就是11位,加上0位的,字符串结束符'\0',就造成了2个字符的溢出。