Malloc /免费双免费或腐败错误

时间:2018-01-05 14:01:09

标签: c string initialization malloc free

我在一个更复杂的程序中使用的简单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之前和之后都有相同的地址。

1 个答案:

答案 0 :(得分:1)

这里

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 ); 

会在char范围之外写出1 MessageOut,因为根据ab设置数据后会添加'\0',所以称为0 - 终结符,即每个C - "字符串"携带到制造商是结束。

要解决此问题,请相应调整malloc()的相关电话:

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