コードでは、3 番目のパラメーターにゼロを渡しています。
仕様によれば、3 番目のパラメーターを null にすることはできません。2 番目のパラメーターの長さを示す整数へのポインターである必要があり、出力ではアドレスの実際のサイズが示されます。ゼロを渡すことは、ストレージが割り当てられていないことを意味するのではなく、情報も出力値を書き込む場所も渡していないことを意味します。
MSDN および Linux のドキュメントによると、関数は -1 を返し、errno
(またはWindows ソケットではEFAULT
WSAGetLastError をon に) に設定する必要があります。WSAEFAULT
これは、「name および namelen パラメーターを指定どおりに使用すると、呼び出し元のアドレス空間外のストレージにアクセスしようとする結果になる」と定義されています。
ただし、これは Posix 仕様の一部ではありません。関数がアドレスをチェックする必要があるとは考えていません。つまり、少なくとも Posix では、これは未定義の動作です。つまり、何でも起こり得るということです。
Linux では、null が渡された場合に 2 つのパラメーターが無視されることを観察したと言います。コードが戻り値をチェックしていないと思われます。これはおそらく -1 でerrno
set to になりEFAULT
ます。
Posix 関数は例外をスローしません。おそらく次のような戻りコードを確認する必要があります。
int result = getsockname(*x,NULL,0);
if(result){
/*Failed - handle here*/
}