执行free()时出错,显示“quot;glibc检测到双重自由或腐败”;

执行free()时出错,显示“quot;glibc检测到双重自由或腐败”;,c,malloc,free,glibc,C,Malloc,Free,Glibc,我正在尝试使用我用malloc()手动分配的数组运行程序。我在程序结束时释放了()这个数组,但我一直收到一个错误,说***glibc detected***./测试:双重释放或损坏(!prev):0x000000000217710*** 以下是我的主要观点: int main(int argc, char** argv) { pthread_t t1, t2, t3; int i = 1; int k = 0; Client* clients; clie

我正在尝试使用我用malloc()手动分配的数组运行程序。我在程序结束时释放了()这个数组,但我一直收到一个错误,说
***glibc detected***./测试:双重释放或损坏(!prev):0x000000000217710***

以下是我的主要观点:

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;
}
int main(int argc,char**argv)
{
pthread_t t1、t2、t3;
int i=1;
int k=0;
客户*客户;
客户=(客户*)malloc((nbClients+1)*sizeof(客户));

对于(i=1;i,您正在访问分配的缓冲区的边界之外,这可能会破坏malloc数据结构,从而导致出现错误。这是错误的

循环应为:

for (i = 0; i < nbClients+1; i++)
for(i=0;i
请记住,索引从C中的0开始。

free()
失败时,这是因为程序中的某些内存损坏(由bug引起)


在这种情况下,这是因为C中(i=1;i索引)的循环
从零开始。客户端的最后一个索引是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++)
   ...
定义新的数组(ptr,n)(ptr)=malloc((n)*sizeof(ptr)[0]) int clientsLen=nbClients+1; 新的_阵列(客户端、客户端); 对于(i=0;i
lmaooo是的,我刚刚看到了,sry,我真的很累,我想谢谢你,它现在可以工作了,但我总是得到相同的值?这正常吗?(我使用的是随机int函数,它总是完全相同)我没有看到任何随机数生成。你可能在没有发布的代码中有其他问题。是的,没关系,我更正了它(我没有放任何种子),Fankslmaoo是的,只是看到了,sry我真的很累,我想谢谢你,它现在可以工作了,但我总是得到相同的值?正常吗?(我使用的是随机int函数,它总是完全相同!)绝对没有理由使用那个难看的宏。请不要建议人们混淆他们的代码。你用那个宏所能做到的就是更多的潜在错误,同时,代码变得更难阅读。像宏一样的函数是最后的选择,当你使用它们时,你必须绝对使用一个外括号。@Lund在中,我不想每次分配内存时都进行容易出错的大小计算。如果指针的类型或名称发生更改,我也不想在超出必要的地方更新代码。对于“类似于宏的函数是最后的手段”,我完全同意。新的数组将用作语句,因此缺少外圆括号。