功能卡在一个循环中

时间:2017-04-15 18:13:57

标签: c

我正在用C做一个学校项目,我陷入了这个难题。 因此,我们需要为100个用户使用套接字实现消息传递系统 我将用户的数据存储在此结构中。

typedef struct user
{
   char username[20];
   int online;        //flag value 1 = online, 0 = offline
   msg *message_list;
   int message_count;
}

我们需要实现的一项服务是提取所有当前连接用户的列表。我已为此任务编写了此功能。

void all_connected(char buf[2300])
{
    printf("\n entering all_connected for %d iterations",user_count);
    int i, count = 1;
    char tmp[25];
    for (i=0; i<user_count; i++)
    {
        if(users[i] -> online == 1)
        {            
            sprintf(tmp, "\n\t%d. %s", count++, users[i] -> username);
            strcat(buf, tmp);
        }
    }
    printf("\n exiting all_connected");
}

现在出于一些奇怪的原因,当我在请求服务时调用此函数时,它会打印第一个printf(为x次迭代输入all_connected);但它没有打印我放在最后一行的那个。 这是否意味着该功能卡在某条线上?我检查了它,它正在迭代'user_count'次,但永远不会在最后一行。

发生这种情况可能是什么原因?

1 个答案:

答案 0 :(得分:0)

此格式字符串"\n\t%d. %s"(假设每个用户最多20个字符)将需要一个26字节(ASCII)缓冲区。这就是原因:

  1. "\n"的1或2个字节(取决于系统)
  2. "%d"最多2个字节(假设你数到99)
  3. ". "
  4. 的2个字节
  5. "%s"
  6. 最多20个字节

    您的临时缓冲区char tmp[25];太窄 - 必须至少26字节大(计算NULL终结符)。

    如果您有一个包含100个用户的列表,这些用户需要至少2601字节的总缓冲区,但从它的外观来看,您只提供具有2300大小的缓冲区的功能。旁注,只需指定函数&# 39;输入参数为char buf[2300]并没有做任何事情来实际分配该缓冲区。在调用函数时,您必须确保提供必要的缓冲区。

    您没有获得第二个printf()的原因是因为您的程序在到达该点之前终止。终止的原因是内存访问冲突 - 当您尝试将某些内容写入不属于您的缓冲区的内存中时(或者是一个小缓冲区或错误的内容)

    >