我在一个更复杂的程序中使用的简单malloc
/ free
函数存在问题,我找不到如何摆脱这个问题。
我的项目如下:
的main.c
while(1){programm();}
我尝试了很多测试来了解它的来源,但我找不到解决方案......
这里是代码部分,似乎是bug:
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
套接字似乎没有问题,因为我在sendto
之前和之后都有相同的地址。
答案 0 :(得分:1)
这里
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 );
会在char
范围之外写出1 MessageOut
,因为根据a
和b
设置数据后会添加'\0'
,所以称为0
- 终结符,即每个C - "字符串"携带到制造商是结束。
要解决此问题,请相应调整malloc()
的相关电话:
MessageOut = malloc(strlen(a) + strlen(b) + 1); /* There is no need to cast
the result fo malloc in C. */