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同理)


假设 ab 已正确设置此调用

sprintf( (char*)MessageOut, "%s%s",a, b ); 

将在 MessageOut 范围之外写入 1 char,因为在按照 ab 设置数据之后,将放置额外的 '[=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. */