C语言 Malloc/free double free 或损坏错误



我在更复杂的程序中使用的简单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(


假设ab设置正确,此调用

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

将写入超出MessageOut边界的 1 char,因为在按照 ab 设置数据后,将放置额外的'',即所谓的 0 - 终止符,每个 C-"字符串"携带到 maker 是结束。

要解决此问题,请相应地调整相关调用以malloc()

  MessageOut = malloc(strlen(a) + strlen(b) + 1); /* There is no need to cast 
                                                     the result fo malloc in C. */

最新更新