c - 函数陷入循环

标签 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 (输入 all_connected 进行 x 次迭代);但它不会打印我放在最后一行的内容。 这是否意味着该函数卡在了某行?我检查了一下,它正在迭代“user_count”次,但从未出现在最后一行。

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

最佳答案

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

  1. “\n” 1 或 2 个字节(取决于系统)
  2. “%d” 最多 2 个字节(假设您数到 99)
  3. "."为 2 个字节
  4. “%s”最多 20 个字节

您的临时缓冲区 char tmp[25]; 太窄 - 必须至少有 26 个字节大(包括 NULL 终止符)。

如果您有一个包含 100 个用户的列表,则需要至少 2601 字节的总缓冲区,但从外观上看,您只需为函数提供大小为 2300 的缓冲区。旁注,只需指定函数的输入参数为 char buf[2300] 不会执行任何操作来实际分配该缓冲区。您必须确保在调用函数时提供必要的缓冲区。

您没有得到第二个 printf() 的原因是您的程序在到达该点之前终止。终止的原因是内存访问冲突 - 当您尝试向内存中写入不属于缓冲区的内容(无论是小缓冲区还是错误缓冲区)时,就会发生这种情况

关于c - 函数陷入循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43429597/

相关文章:

关于 C 的 stat() 函数的令人困惑的文档

c - 将数组从文件 1 中的方法传递到文件 2 中的方法,而不在方法中使用额外参数

c++ - C/C++ 外部函数声明

c - 不正确的阶乘计算

c - 循环变量显示垃圾值

c - NOP 雪橇如何工作?

c 复制 ptr 的第一个字母

c - 为什么链接会影响同一节内的相对跳转是否需要重定位?

统计字符串中某个字符出现的次数 : how can I interpret this code?

以太网传输时字节顺序的变化