malloc()多次返回同一地址,即使我没有';t免费使用()

malloc()多次返回同一地址,即使我没有';t免费使用(),c,pthreads,malloc,C,Pthreads,Malloc,编辑:我确实使用了free(),忽略标题 要点是每次调用malloc(),地址0x8403620 返回,这是我使用Gdb发现的 tellers[i] = create_teller(0, i, NULL); 我首先在第72行使用malloc()创建3个出纳员结构。返回的第一个地址(通过Gdb可见)是0x84003620。二是 0x84033a0,第三个0x84034e0。一切似乎都很好 clients[i] = create_client(0, i, -1, -1); 然后我使用第77行的m

编辑:我确实使用了free(),忽略标题

要点是每次调用
malloc()
,地址0x8403620 返回,这是我使用Gdb发现的

tellers[i] = create_teller(0, i, NULL);
我首先在第72行使用
malloc()
创建3个出纳员结构。返回的第一个地址(通过Gdb可见)是0x84003620。二是 0x84033a0,第三个0x84034e0。一切似乎都很好

clients[i] = create_client(0, i, -1, -1);
然后我使用第77行的
malloc()
create\u client(
)函数 创建100个客户端。分配给客户端[0]的第一个地址是。。。 0x8403620。与出纳员相同[0]。情况变得更糟了。下一个地址 当i=1时,从
malloc()返回的
is0x8403620,依此类推
对于i=3,4,…,99,打开

它本身不是
create\u client()
create\u teller()
函数,而是 相反,
malloc()
函数本身

这只是一种非常奇怪的情况

现在,我想问:我是否使用了
malloc()
错误?或者我的
malloc()
版本是否存在漏洞,我是否应该以某种方式重新安装它?这很可能是我的代码,因为它用于创建出纳员,而不是客户

以下是完整的代码:

#包括
#包括
#包括
#包括
#包括
#包括
#包括
typedef struct-teller-teller\t;
类型定义结构客户端;
出纳员*创建出纳员(pthread\u t thread\u id,int id,client\u t*分配的\u client);
client_t*create_client(pthread_t thread_id,int id,int operation,int amount);
void*run\u出纳员(void*arg);
void*run\u客户端(void*arg);
/*业务类型*/
#定义存款0
#定义撤消1
#定义NUM_出纳员3
#定义NUM_客户端100
结构客户端{
pthread_t thread_id;
int-id;
int操作;
整数金额;
};
结构出纳{
pthread_t thread_id;
int-id;
bool可用;
客户(t)指定客户(t);;
};
客户_t*客户[100];
出纳员[3];
/*一次只有两名出纳员可以访问*/
扫描安全;
/*一次只能有一名出纳员访问*/
结构经理;
/*可用出纳员数量,最多3名*/
sem_t line;/*是否重命名为可用*/
/*等待客户分配给他们的每个出纳员*/
不要等待客户[3];
int
主(内部argc,字符**argv){
(无效)argc;
(无效)argv;
srand(时间(空));
/*这也告诉我们已经服务了多少客户*/
int client_index=0;
sem_init(&safe,0,2);
sem_init(&经理,0,1);
sem_init(&line,0,0);
对于(int i=0;i<3;i++)
sem_init(&wait_for_client[i],0,0);
对于(int i=0;ithread_id,NULL,run_teller,(void*)tellers[i]);
}
对于(int i=0;ithread_id,NULL,run_client,(void*)clients[i]);
}
/*调试
对于(int i=0;iid);
}
*/
//没有线程应该通过这一点!!!
// ==------------------------------------==
//下面所有这些都应该由客户而不是主要客户来处理吗?
而(1){
如果(客户端索引>=NUM\u客户端){
//待办事项:
//告诉出纳员已经没有客户了
//所以他们应该关闭,然后关闭银行。
打破
}
sem_等待(&line);
对于(int i=0;i<3;i++){
if(出纳员[i]->可用){
int client_id=客户端[客户端索引]->id;
//printf(“客户端索引=%d\n”,客户端索引);//调试
出纳员[i]->分配的客户=客户[client_index++];
出纳员[i]->可用=假;
printf(
“客户端%d转到出纳员%d\n”,
客户id,
出纳员[i]->id
);
sem_post(等待客户[i]);
打破
}
}
//sem_post(&line);//需要这个吗?
}
返回退出成功;
}
出纳员*
创建\u出纳(pthread\u t thread\u id、int id、client\u t*分配的\u client){
teller_t*t=(teller_t*)malloc(sizeof(teller_t));
如果(t==NULL){
printf(“错误:无法分配出纳员。\n”);
退出(退出失败);
}
t->thread\u id=thread\u id;
t->id=id;
t->available=true;
t->assigned_client=assigned_client;
返回t;
}
/*TODO:Malloc每次都返回相同的地址,请修复此问题*/
客户*
创建客户端(pthread\u t thread\u id、int id、int operation、int amount){
client_t*c=malloc(sizeof(client_t));
如果(c==NULL){
printf(“错误:无法分配客户端。\n”);
退出(退出失败);
}
c->thread\u id=thread\u id;
c->id=id;
c->操作=操作;
c->金额=金额;
返回c;
}
空虚*
run_出纳员(void*arg){
出纳员t*t=(出纳员t*)arg;
printf(“出纳员%d可用\n”,t->id);
而(1){
/*告诉电话线有出纳员*/
sem_post&line;
/*当该行将客户分配给该出纳员时传递*/
sem_wait(&wait_for_client[t->id]);
断言(t->assigned_client!=NULL);
如果(t->分配的客户机->操作==撤消){
}
否则{
}
}
自由(arg);
pthread\u cancel(t->thread\u id);
返回NULL;
}
空虚*
运行_客户端(void*arg){
client_t*c=(client_t*)arg;
c->operation=rand()&1;
printf(
“客户端%d排队等待生成%s\n”,
c->id,
((c->操作==存款)-“存款”:“取款”)
);