ソケットプログラミングを開始したところ、関数 inet_ntoa に出くわしました。関数にはプロトタイプがありchar * inet_ntoa(struct in_addr in);
ます。
では、この文字列はどのように/どこに割り当てられるのでしょうか? 私はそれで無料で電話をかけることが期待されていますか?
ソケットプログラミングを開始したところ、関数 inet_ntoa に出くわしました。関数にはプロトタイプがありchar * inet_ntoa(struct in_addr in);
ます。
では、この文字列はどのように/どこに割り当てられるのでしょうか? 私はそれで無料で電話をかけることが期待されていますか?
からinet_ntoa(3)
:
inet_ntoa() 関数は、ネットワーク バイト オーダーで指定されたインターネット ホスト アドレスを、標準の数字とドットによる表記の文字列に変換します。文字列は静的に割り当てられた buffer に返され、後続の呼び出しで上書きされます
いいえ。
いいえ、解放しません。通常、関数内の静的ストレージ、またはスレッド環境で実行している場合はスレッド固有のデータです。
の戻り値は
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;
}
静的であるため、解放する必要はありません。
ただし、関数を再度呼び出す前に、文字列の内容のコピーを取得する必要があります。そうしないと、最初の呼び出しの内容が上書きされます。