【问题标题】:Assignment error cast in CC中的赋值错误
【发布时间】:2012-10-27 20:09:10
【问题描述】:

我有以下代码:

struct message_t *msg = ( struct message_t* ) malloc ( sizeof( struct message_t ) );
struct server_t *server = ( struct server_t* ) malloc ( sizeof( struct server_t ) );

server = network_connect( argv[ 2 ] );

函数network_connect 返回一个struct server_t。但是我有争议地得到了错误:

警告:赋值使指针从整数不进行强制转换[默认启用]。

我不明白这个错误...首先我没有为指针 server_t 分配内存。好吧,我得到了错误并尝试分配内存,什么也没有。我查看了代码 network_connect,一切正常。

【问题讨论】:

  • network_connect() 的原型是什么 - 我怀疑返回类型不是 struct server_t *

标签: c casting variable-assignment


【解决方案1】:

我的超能力告诉我,您缺少 network_connect 函数的函数原型(声明)——请确保包含它所在的头文件。

在 C 中,编译器允许隐式声明:当编译器看到一个以前从未见过的新函数名(例如 network_connect)时,它假定它采用任意数量和类型的参数并返回int。因此,由于隐式函数声明,编译器认为您正在尝试从 int 转换为 struct server_t*,这会导致给定警告。

您的代码中还存在内存泄漏——您使用mallocserver 对象分配内存,然后您立即用network_connect 返回的值覆盖该指针,因此您分配的内存永远消失了。在这种情况下不需要分配任何内存,因为network_connect 直接返回它的值。

最后,在 C 中,没有必要强制转换 malloc 的返回值。 malloc 返回 void*,C(但不是 C++)允许从 void* 隐式转换为任何其他指针类型。这里的强制转换只是不必要的额外冗长,它实际上可以隐藏错误——如果你忘记包含<stdlib.h>,那么任何malloc 的使用都将使用返回int 的隐式声明(见上文)。演员表将隐藏错误(您忘记包含<stdlib.h>),而没有演员表会给您一个警告。

【讨论】:

  • 我太笨了!!是的,我忘记了 network_client_private.h 中的 #include 标头 network_client.h。非常感谢!
  • 我在很多文章中都读到了相同的内容,但是我的老师总是要求强制转换所有 malloc。 =X 所以我们投!我会删除 malloc,就像你说的。一开始我没有分配内存,但我遇到了错误,所以我尝试分配。谢谢。
【解决方案2】:

根据您对network_connect 声明的描述和错误消息,我会说network_connect 看起来像

struct server_t network_connec(char *);

上面的声明说函数返回结构原样,即它返回一个副本。但是您将变量server 声明为指针,并且不能将非指针值分配给指针。解决方案是不要将server 变量设为指针(因为分配会引入内存泄漏),只需将其声明为普通的非指针变量即可:

struct server_t server;

【讨论】:

  • network_connect 声明为 struct server_t *network_connect(char * );我介绍了包含并解决了问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 2018-02-02
  • 1970-01-01
相关资源
最近更新 更多