【发布时间】:2018-01-05 14:01:09
【问题描述】:
我在一个更复杂的程序中使用一个简单的malloc/free 函数时遇到问题,我找不到解决这个问题的方法。
我的项目看起来像:
main.c
while(1){programm();}
我尝试了很多测试来知道它来自哪里,但我找不到解决方案......
这是似乎有问题的代码部分:
programm.c
void programm(){
... Creating variables and getting infos from socket ...
char a[512];
char b[512];
sprintf(a,"blablabla",strlen(a));
sprintf(b,"blablabla",strlen(b));
char* MessageOut = NULL;
MessageOut = (char*)malloc(strlen(a)+strlen(b));
if(MessageOut==NULL)
printf("MessageOut Is Null\n");
else
printf("%x\n",(uint)MessageOut);
printf("Size of Malloc:%d\n",strlen(a)+strlen(b));
sprintf( (char*)MessageOut, "%s%s",a, b );
MessageOut[0] = 0x02;
MessageOut[1] = Data[1];
MessageOut[2] = Data[2];
MessageOut[3] = 0x03;
byte_nb = sendto(client_socket, (void *)MessageOut, strlen(a)+strlen(b), 0, (struct sockaddr *)&dist_addr, addr_len);
if (byte_nb == -1) {
printf("send error:%s\n", strerror(errno));
} else {
printf("%i bytes sent\n", byte_nb);
}
printf("%s\n",MessageOut);
if(MessageOut==NULL)
printf("MessageOut Is Null\n");
else
printf("%x\n",(uint)MessageOut);
free(MessageOut);
printf("Test\n");
}
正如我所说的它只是我代码的一部分,我试图将它总结为出错的部分。
所有这些都在while(1)-loop 中。
我得到的错误是双重释放或损坏(!prev)
printf给我:
1c7eeb0
Size Of Malloc : 196
196 Bytes sent
1c7eeb0
第一个循环正常工作,但几次后我得到了
Error: double free or corruption (!prev): 0x01c7eeb0
好像不是socket有问题,因为我sendto前后的地址是一样的。
【问题讨论】:
-
越界写入,未定义行为。
-
那么
a和b是如何定义和设置的? -
你应该多分配一个字节来存储空终止符。
-
是的 a 和 b 已定义和设置。字符 [512];字符 b[512]; sprintf(a,"blablabla",strlen(a)); sprintf(b,"blablabla",strlen(b));对不起,我应该提到这一点
标签: c string initialization malloc free