C中的赋值错误

时间:2012-10-27 20:09:10

标签: c casting variable-assignment

我有以下代码:

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,一切都是正确的。

2 个答案:

答案 0 :(得分:2)

我的通灵能力告诉我你错过了network_connect函数的函数原型(声明) - 确保包含它所包含的头文件。

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

您的代码中也有内存泄漏 - 您使用servermalloc对象分配内存,然后立即使用network_connect返回的值覆盖该指针,所以你分配的记忆永远消失了。在这种情况下,不需要分配任何内存,因为network_connect直接返回其值。

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

答案 1 :(得分:0)

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

struct server_t network_connec(char *);

上述声明表示该函数返回结构,即它返回一个副本。但是您将变量server声明为指针,并且不能将非指针值指定给指针。解决方案是不要使server变量成为指针(因为该分配会引入内存泄漏)并将其声明为普通的非指针变量:

struct server_t server;