我正在用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'次,但永远不会在最后一行。
发生这种情况可能是什么原因?
答案 0 :(得分:0)
此格式字符串"\n\t%d. %s"
(假设每个用户最多20个字符)将需要一个26字节(ASCII)缓冲区。这就是原因:
"\n"
的1或2个字节(取决于系统)"%d"
最多2个字节(假设你数到99)". "
"%s"
您的临时缓冲区char tmp[25];
太窄 - 必须至少26字节大(计算NULL终结符)。
如果您有一个包含100个用户的列表,这些用户需要至少2601字节的总缓冲区,但从它的外观来看,您只提供具有2300大小的缓冲区的功能。旁注,只需指定函数&# 39;输入参数为char buf[2300]
并没有做任何事情来实际分配该缓冲区。在调用函数时,您必须确保提供必要的缓冲区。
您没有获得第二个printf()
的原因是因为您的程序在到达该点之前终止。终止的原因是内存访问冲突 - 当您尝试将某些内容写入不属于您的缓冲区的内存中时(或者是一个小缓冲区或错误的内容)