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) を検出すると、任意の数と型の引数を取り、 を返すと想定しますintintしたがって、暗黙的な関数宣言により、コンパイラは、からに変換しようとしていると見なしstruct server_t*、その結果、指定された警告が発生します。

また、コードにメモリ リークがあります。 を使用してserverオブジェクトにメモリを割り当てmalloc、そのポインタを が返す値ですぐに上書きするnetwork_connectため、割り当てたメモリは永久に失われます。network_connectこの場合、値を直接返すため、メモリを割り当てる必要はありません。

最後に、C では、 の戻り値をキャストする必要はありませんmallocmallocは a を返し、void*C (ただし C++ ではない) はvoid*他の任意のポインター型への暗黙的なキャストを許可します。ここでのキャストは不必要な余分な冗長であり、実際にはエラーを隠すことができ<stdlib.h>ます。キャストはエラー (を含めるのを忘れた) を非表示にしますが、キャストがない場合は警告が表示されます。mallocint<stdlib.h>

于 2012-10-27T20:15:08.963 に答える
0

network_connect宣言の説明とエラーメッセージをnetwork_connect見ると、次のようになります

struct server_t network_connec(char *);

上記の宣言は、関数が構造そのまま返す、つまりコピーを返すことを示しています。serverただし、変数をpointerとして宣言すると、ポインター以外の値をポインターに割り当てることはできません。解決策は、変数をポインターにせずserver(割り当てによってメモリ リークが発生するため)、通常の非ポインター変数として宣言することです。

struct server_t server;
于 2012-10-27T20:15:02.017 に答える