我试图使用我用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;
}
感谢您的帮助
答案 0 :(得分:2)
当free()
失败时,由于错误导致程序中存在一些内存损坏。
在这种情况下,这是因为循环for (i = 1; i <= nbClients+1; i++)
访问数组越界。
答案 1 :(得分:1)
您正在访问所分配的缓冲区范围之外,这可能会破坏malloc数据结构,从而导致您获得错误。这是undefined behaviour。
循环应该是:
for (i = 0; i < nbClients+1; i++)
请记住,索引从C中的0开始。
答案 2 :(得分:1)
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++)
...