teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2018/09/13 23:48

投稿

otn
otn

スコア86349

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  > 構造体の参照渡しだと予測したのですが,前のカッコはキャストなのでしょうか.
2
2
 
3
- Cに参照渡しは無いので、アドレスを渡しています。前の括弧はキャストです。
3
+ Cに参照渡しは無いので、アドレスを渡しています。予測としては合ってます。前の括弧はキャストです。
4
4
 
5
5
  > 仮にキャストだとして最初からその型で宣言することはできないのでしょうか.
6
6
 
@@ -10,4 +10,4 @@
10
10
  `struct sockaddr`は、バイト数だけ合わせてあるだけで、値をセットできるようなフィールドはありません。
11
11
  そのため、`struct sockaddr`で変数を宣言してしまうと、この構造体にはインターネットドメインソケット固有の情報であるIPアドレスやポート番号のフィールドがありませんので、それらの値をセットできません。
12
12
 
13
- まあ、複数の型を重ね合わせるわけなので、本来は`union`で処理すべきだったのかも知れませんが、そうはなっていません。
13
+ まあ、複数の型を重ね合わせるわけなので、本来は`union`で処理すべきだったのかも知れませんが、そうはなっていません。歴史的には、昔のCには関数のプロトタイプ宣言がなかったので、こういう引数の型合わせのキャストは不要でした。プロトタイプ宣言が登場した時点で、`struct sockaddr`を`union`化していれば後の人にはわかりやすかったかも知れませんが、それまでのプログラムが修正が必要になるので、考えなかったんだと思います。