【问题标题】:C warning: assignment makes integer from pointer without a cast / pointer to integer arrayC警告:赋值从没有强制转换/指向整数数组的指针的指针中生成整数
【发布时间】:2019-04-10 17:13:08
【问题描述】:

我正在尝试使用 C 语言中的 TCP/IP 创建一个聊天室,但每个新客户端都是一个新线程。客户端必须与服务器相互通信。我在创建新线程时遇到问题。

当调用pthread_create(&thread_id, NULL, messenger, (void*)client_socket) 时,我试图传递新客户端的套接字描述符并将其添加到整数数组中。但无论我尝试什么,我都会收到以下警告:

赋值从没有强制转换的指针生成整数

这是我遇到问题的代码。在main 函数中有一个名为users 的全局int 变量:

users = 0;
int new_socket;
int *clinet_socket;

new_socket = accept(master_socket, (struct sockaddr *)&address, (socklen_t*)&addrlen);
client_socket = &new_socket;

pthread_create(&thread_id, NULL, messenger, (void*)client_socket)

这是messenger函数:

void *messenger(void *sockel){
   unsigned int (*sockerde)[30];

   (*sockerde)[users] = (unsigned int(*))&sockel;
   users++;
}

关键是要保存一个包含所有连接客户端的套接字描述符的数组,以便以后使用它。

【问题讨论】:

  • 为什么你的函数定义是“int *clinet_socket;”不能是“void *clinet_socket”?
  • messenger函数的多个问题: 1)变量sockel是一个指针,&sockel是一个指向指针的指针。 2)您将sockerde 定义为一个指向30 无符号整数数组的指针,而不是一个包含30 个指针的数组(如果这是您真正想要的)。 3) 你永远不会初始化指针sockerde,所以取消引用它是未定义的行为。 4) (*sockerde)[users]unsigned int(unsigned int(*))&sockel 是指针,这是警告消息的来源。
  • 还有其他可能的问题,例如一个取决于new_socket 变量的生命周期与线程生命周期的比较。
  • 总而言之,您可能应该退后几步,回到初学者书籍或教程中,阅读有关指针及其工作原理的更多信息。
  • 哦,最后,当使用pthread_create 时,通常认为可以将值转换为指针,而在函数中进行相反的转换。就像例如pthread_create(&thread_id, NULL, messenger, (void *) (intptr_t) new_socket),在函数int sock = (int) (intptr_t) sockel;

标签: c pointers tcp casting pthreads


【解决方案1】:

你遇到问题的部分是你的问题中最少的。

  • 您没有进行错误检查。
  • 您通过引用传递套接字值,但您无法确保 new_socket 值在新线程获取它之前保持稳定。
  • 您正在通过 unsigned int (*sockerde)[30]; 数组指针进行分配,该指针不指向任何地方!
  • 您正在从多个线程访问全局而不进行任何同步

最后

  • 您正在使用奇怪的括号样式将本地参数的地址(这样做没有意义)转换为unsigned int*,然后您尝试通过无效指针将其分配给unsigned int,即是什么导致了类型错误。

也许拿起一本书?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 2015-10-19
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多