0

我有以下代码:

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 返回一个结构 server_t。但是我有争议地得到了错误:

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

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

4

2 回答 2

2

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

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

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

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

于 2012-10-27T20:15:08.963 回答
0

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

struct server_t network_connec(char *);

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

struct server_t server;
于 2012-10-27T20:15:02.017 回答