Malloc/free 双重释放或损坏错误
Malloc/free double free or corruption error
我在一个更复杂的程序中使用一个简单的 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)
循环中。
我得到的错误是双重释放或损坏 (!prev)
printf
给我:
1c7eeb0
Size Of Malloc : 196
196 Bytes sent
1c7eeb0
第一个循环工作正常,但在几次之后我得到了
Error: double free or corruption (!prev): 0x01c7eeb0
看来不是socket的问题,因为我在sendto
前后的地址是一样的。
这里
sprintf(a,"blablabla",strlen(a));
strlen()
传递了一个未初始化的 a
,它会调用未定义的行为。
初始设置 a
根据定义初始化它:
char a[512] = "blablabla";
或在:
之后设置
char a[512];
strcpy(a, "blablabla");
(b
同理)
假设 a
和 b
已正确设置此调用
sprintf( (char*)MessageOut, "%s%s",a, b );
将在 MessageOut
范围之外写入 1 char
,因为在按照 a
和 b
设置数据之后,将放置额外的 '[=25=]'
,所谓的 0
-终结符,每个 C-"string" 携带到 maker 就是终结符。
要解决此问题,请相应地调整对 malloc()
的相关调用:
MessageOut = malloc(strlen(a) + strlen(b) + 1); /* There is no need to cast
the result fo malloc in C. */
我在一个更复杂的程序中使用一个简单的 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)
循环中。
我得到的错误是双重释放或损坏 (!prev)
printf
给我:
1c7eeb0
Size Of Malloc : 196
196 Bytes sent
1c7eeb0
第一个循环工作正常,但在几次之后我得到了
Error: double free or corruption (!prev): 0x01c7eeb0
看来不是socket的问题,因为我在sendto
前后的地址是一样的。
这里
sprintf(a,"blablabla",strlen(a));
strlen()
传递了一个未初始化的 a
,它会调用未定义的行为。
初始设置 a
根据定义初始化它:
char a[512] = "blablabla";
或在:
之后设置char a[512];
strcpy(a, "blablabla");
(b
同理)
假设 a
和 b
已正确设置此调用
sprintf( (char*)MessageOut, "%s%s",a, b );
将在 MessageOut
范围之外写入 1 char
,因为在按照 a
和 b
设置数据之后,将放置额外的 '[=25=]'
,所谓的 0
-终结符,每个 C-"string" 携带到 maker 就是终结符。
要解决此问题,请相应地调整对 malloc()
的相关调用:
MessageOut = malloc(strlen(a) + strlen(b) + 1); /* There is no need to cast
the result fo malloc in C. */