0

ソケットプログラミングを開始したところ、関数 inet_ntoa に出くわしました。関数にはプロトタイプがありchar * inet_ntoa(struct in_addr in);ます。

では、この文字列はどのように/どこに割り当てられるのでしょうか? 私はそれで無料で電話をかけることが期待されていますか?

4

3 に答える 3

3

からinet_ntoa(3):

inet_ntoa() 関数は、ネットワーク バイト オーダーで指定されたインターネット ホスト アドレスを、標準の数字とドットによる表記の文字列に変換します。文字列は静的に割り当てられた buffer に返され、後続の呼び出しで上書きされます

いいえ。

于 2011-03-16T11:40:54.623 に答える
2

いいえ、解放しません。通常、関数内の静的ストレージ、またはスレッド環境で実行している場合はスレッド固有のデータです。

決定的なPOSIXマニュアルページから:

の戻り値はinet_ntoa()、後続の への呼び出しによって上書きされる可能性がある静的データを指す場合がありますinet_ntoa()

そのページには次のようにも記載されています。

inet_ntoa() 関数は再入可能である必要はありません。再入可能である必要のない関数は、スレッドセーフである必要はありません。

つまり、スレッド化された環境であっても、スレッドセーフではない可能性があります。

つまり、次のように実装できます。

char *inet_ntoa (struct in_addr xyz) {
    static char buff[50];
    // Do something with xyz to populate buff.
    return buff;
}
于 2011-03-16T11:39:50.137 に答える
1

静的であるため、解放する必要はありません。

ただし、関数を再度呼び出す前に、文字列の内容のコピーを取得する必要があります。そうしないと、最初の呼び出しの内容が上書きされます。

于 2011-03-16T11:41:28.367 に答える