私は最近、Cで複合リテラル配列への参照を実際に使用できることを知りました。これは便利だと思いますが、それがどのように機能するかはよくわかりません。
たとえば、次のように、戻り名の長さを気にしないソケットインターフェイス関数を呼び出すために変数を宣言する必要がないように、この機能を使用するとします。
int sockfamily(int fd)
{
struct sockaddr_storage ss;
getpeername(fd, (struct sockaddr *)&ss, (socklen_t [1]){sizeof(ss)});
return(ss.ss_family);
}
明らかsizeof(ss)
に、スタックへのポインタをに渡すには、実際にスタックに格納する必要がgetpeername
あります。したがって、スタック上のスペースは、その目的のために割り当てて予約する必要がありますが、この割り当ての存続期間はどのくらいですか?割り当てられたままであるとどのくらい信頼できますか?
GCCのアセンブリ出力を見ると、呼び出しをgetpeername
ループに入れた場合、割り当てはループの複数の反復で存続しないことがわかりますが、他のどのような条件でそれが存在しなくなる可能性がありますか?