执行 free() 时出错说 "glibc detected double free or corruption"

Error while executing free() saying "glibc detected double free or corruption"

我正在尝试 运行 使用我用 malloc() 手动分配的数组的程序。我在程序末尾释放了这个数组,但我一直收到一条错误消息 *** glibc detected *** ./test: double free or corruption (!prev): 0x0000000002177010 ***

这是我的主要内容:

int main(int argc, char** argv)
{
    pthread_t t1, t2, t3;
    int i = 1;
    int k = 0;
    Client* clients;
    clients = (Client*) malloc((nbClients+1)*sizeof(Client));
    for (i = 1; i <= nbClients+1; i++)
    {
        printf("\n----TICKET%d----\n", i);
        clients[i].panier = (int*) malloc(nbArticles*sizeof(int));      
        achats(clients[i].panier, &clients[i].ticket);

        for (k = 0; k < nbArticles; k++)
        {
            printf("panier[%d] = %d\n", k, clients[i].panier[k]);

        }

        pthread_create(&t1, NULL, calcMACL, &clients[i]);

        //calcMQUAD(clients[i].panier, &clients[i].ticket);
        //calcMACL(clients[i].panier, &clients[i].ticket);
        //calcMCUBE(clients[i].panier, &clients[i].ticket);

        pthread_join(t1, NULL);
        //free(clients[i].panier);

    }

    free (clients);




    return 0;
}

感谢您的帮助

您正在访问您分配的缓冲区的边界之外,这可能会破坏 malloc 数据结构,从而导致您收到错误。这是undefined behaviour.

循环应该是:

for (i = 0; i < nbClients+1; i++)

记住,索引在C中是从0开始的。

free() 失败时,这是因为程序中的一些内存损坏,由错误引起。

这里是因为循环for (i = 1; i <= nbClients+1; i++)访问数组越界

C 中的索引从零开始。 clients 的最后一个索引是 nbClients + 1 - 1 这意味着您的环路防护是错误的。我建议对动态数组的长度使用一个单独的变量,并为内存分配使用一个宏:

#define NEW_ARRAY(ptr, n) (ptr) = malloc((n) * sizeof (ptr)[0])

int clientsLen = nbClients + 1;
NEW_ARRAY(clients, clientsLen);
for (i = 0; i < clientsLen; i++)
   ...