【问题标题】:Malloc/free double free or corruption errormalloc/free 双释放或损坏错误
【发布时间】:2018-01-05 14:01:09
【问题描述】:

我在一个更复杂的程序中使用一个简单的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)-loop 中。

我得到的错误是双重释放或损坏(!prev)

printf给我:

1c7eeb0
Size Of Malloc : 196
196 Bytes sent
1c7eeb0

第一个循环正常工作,但几次后我得到了

Error: double free or corruption (!prev): 0x01c7eeb0

好像不是socket有问题,因为我sendto前后的地址是一样的。

【问题讨论】:

  • 越界写入,未定义行为。
  • 那么ab是如何定义和设置的?
  • 你应该多分配一个字节来存储空终止符。
  • 是的 a 和 b 已定义和设置。字符 [512];字符 b[512]; sprintf(a,"blablabla",strlen(a)); sprintf(b,"blablabla",strlen(b));对不起,我应该提到这一点

标签: c string initialization malloc free


【解决方案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 ); 

将写入 1 个char 超出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. */

【讨论】:

    猜你喜欢
    • 2011-03-12
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多