gpt4 book ai didi

c - list中存储的对象具有相同的ID或指向同一个对象

转载 作者:行者123 更新时间:2023-11-30 15:43:40 25 4
gpt4 key购买 nike

我正在尝试在可以与套接字连接的服务器上对管理器客户端进行简单的CRUD(用C语言,我不太熟悉但我别无选择)。服务器将通过使用 session ID 同时保持 10 个并发连接。问题是,当我在添加 10 个客户端后打印列表时,它显示一个包含 10 倍相同对象的列表(或 10 个具有相同 ID 的对象,这是我有点困惑的地方)。

这就是我声明管理器客户端的结构并声明列表(可以容纳其中 10 个)的方式:

typedef struct Mana_client {
int client_id;
int timestamp_connection;
char privilege_level;
}Mana_client;

Mana_client *mana_client_list[10];
srand(time(NULL)); // is called once when initializing the thread.

这就是我写“将客户端添加到列表”的方式:

int add_mana_client()
{
int i=0;
int client_id = 0;
int timestamp = 0;
Mana_client client = { client_id, timestamp, 1};
client_id = rand()%100000;
timestamp = time(NULL);
client.client_id = &client_id;
client.timestamp_connection = &timestamp;
for(i=0; i <10; i++)
{
if(mana_client_list[i] == NULL){
printf("%u. Empty spot in list\n", i);
if(!contains_mana_client_id(client_id)){
printf("%u. Adding client... (with ID%u)\n", i, client.client_id);
mana_client_list[i] = &client;
return client_id;
}
}
}
return 0;
}

这是我检查具有相同 ID 的客户端是否已在列表中的方法:

int contains_mana_client_id(int id)
{
int i=0;
for(i=0; i <10; i++)
{
if(mana_client_list[i] != NULL){
if(id == mana_client_list[i]->client_id){
printf("%u. Client with ID=%u found.\n", i, id);
return 1;
}
}
}
return 0;
}

然后,检查列表及其客户:

void print_mana_client_list()
{
int i=0;
printf("Printing list of mana clients...\n\n");
for(i=0; i <10; i++)
{
if(mana_client_list[i] != NULL){
printf("%u. Client with ID=%u.\n", i, mana_client_list[i]->client_id);
}else{
printf("%u. Empty.\n", i);
}
}
}

连续运行添加客户端的方法 12 次并打印列表后,我得到以下输出:

  1. 列表中有空位
  2. 正在添加客户端...(ID94630956)添加管理客户端(ID=41)。
  3. 列表中有空位
  4. 正在添加客户端...(ID94630956)添加管理客户端(ID=18467)。
  5. 列表中有空位
  6. 正在添加客户端...(ID94630956)添加管理客户端(ID=6334)。
  7. 列表中有空位
  8. 正在添加客户端...(ID94630956)添加管理客户端(ID=26500)。
  9. 列表中有空位
  10. 正在添加客户端...(ID94630956)添加管理客户端(ID=19169)。
  11. 列表中有空位
  12. 正在添加客户端...(ID94630956)添加管理客户端(ID=15724)。
  13. 列表中有空位
  14. 正在添加客户端...(ID94630956)添加管理客户端(ID=11478)。
  15. 列表中有空位
  16. 正在添加客户端...(ID94630956)添加管理客户端(ID=29358)。
  17. 列表中有空位
  18. 正在添加客户端...(ID94630956)添加管理客户端(ID=26962)。
  19. 列表中有空位
  20. 正在添加客户端...(ID94630956)添加管理客户端(ID=24464)。

已添加管理客户端(ID=0)。

已添加管理客户端(ID=0)。

正在打印 Mana 客户列表...

  1. ID=3435973836 的客户。
  2. ID=3435973836 的客户。
  3. ID=3435973836 的客户。
  4. ID=3435973836 的客户。
  5. ID=3435973836 的客户。
  6. ID=3435973836 的客户。
  7. ID=3435973836 的客户。
  8. ID=3435973836 的客户。
  9. ID=3435973836 的客户。
  10. ID=3435973836 的客户。

我个人认为问题与我存储或传递对象/值的方式有关,但我不完全确定。对此的任何帮助将不胜感激。

最佳答案

这是因为它们是相同的。当你这样做时

mana_client_list[i] = &client;

您始终使用指向局部变量的指针。相反,您应该为循环中的每次迭代创建一个新的结构实例。为此,您需要使用 malloc 为结构分配内存。当您使用完该内存后,请不要忘记释放该内存。

这还将解决您遇到的另一个问题,即您保存指向局部变量的指针,一旦函数 add_mana_client 返回,该变量就会超出范围。在函数返回后使用该指针是未定义行为的一种情况,幸运的是它可以工作。

<小时/>

一种简单的方法,无需对当前代码进行太多修改,可能类似于以下代码来替换当前 mana_client_list[i] = &client; 行:

mana_client_list[i] = malloc(sizeof(Mana_client));
*mana_client_list[i] = client;

这会分配一个新结构,并将已初始化的结构复制到该新结构。

关于c - list中存储的对象具有相同的ID或指向同一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19788647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com