我有以下代码:
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,一切都是正确的。
答案 0 :(得分:2)
我的通灵能力告诉我你错过了network_connect
函数的函数原型(声明) - 确保包含它所包含的头文件。
在C中,编译器允许隐式声明:当编译器看到一个以前从未见过的新函数名时(例如network_connect
),它假定它需要一个任意数字并且参数类型并返回int
。因此,由于隐式函数声明,编译器认为您正在尝试从int
转换为struct server_t*
,从而产生给定的警告。
您的代码中也有内存泄漏 - 您使用server
为malloc
对象分配内存,然后立即使用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;