我在更复杂的程序中使用的简单malloc
/free
函数有问题,我找不到如何摆脱这个问题。
我的项目看起来像:
主.c
while(1){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 Nulln");
else
printf("%xn",(uint)MessageOut);
printf("Size of Malloc:%dn",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:%sn", strerror(errno));
} else {
printf("%i bytes sentn", byte_nb);
}
printf("%sn",MessageOut);
if(MessageOut==NULL)
printf("MessageOut Is Nulln");
else
printf("%xn",(uint)MessageOut);
free(MessageOut);
printf("Testn");
}
正如我所说,它只是我代码的一部分,我试图将其总结为出错的部分。
所有这些都在一个while(1)
循环中。
我得到的错误是双重释放或损坏(!prev(
printf
给我:
1c7eeb0
Size Of Malloc : 196
196 Bytes sent
1c7eeb0
第一个循环工作正常,但经过几个循环我得到
Error: double free or corruption (!prev): 0x01c7eeb0
套接字似乎没有问题,因为我在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
设置数据后,将放置额外的' '
,即所谓的 0
- 终止符,每个 C-"字符串"携带到 maker 是结束。
要解决此问题,请相应地调整相关调用以malloc()
:
MessageOut = malloc(strlen(a) + strlen(b) + 1); /* There is no need to cast
the result fo malloc in C. */