执行free()时出错,显示“quot;glibc检测到双重自由或腐败”;
我正在尝试使用我用malloc()手动分配的数组运行程序。我在程序结束时释放了()这个数组,但我一直收到一个错误,说执行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
***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在中,我不想每次分配内存时都进行容易出错的大小计算。如果指针的类型或名称发生更改,我也不想在超出必要的地方更新代码。对于“类似于宏的函数是最后的手段”,我完全同意。新的数组将用作语句,因此缺少外圆括号。