0

私はまだ C を学んでおり、かなり頻繁に目にするものに関連する質問がありました。間違っている場合は訂正してください。ステートメント 1 はステートメント 2 と同等ですか?

  1. (struct sockaddr *) &echoServAddr
  2. struct sockaddr echoServAddr

私がこれを正しく理解していれば&echoServAddr、 と同じようにフレーム化された構造体にキャストしていsockaddrます。


次のコードは構造体をアドレスで渡していますか?

/* Bind to the local address */
if (bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) {
    perror("bind() failed");
    exit(1);
} 
4

2 に答える 2

1

これらは両方とも関数の引数であると仮定します。これらは異なります。最初の 1 つは、構造体を参照渡しすることです。2 つ目は、構造をそのまま渡します。データ全体がコピーされます。

Bind は 2 番目の引数として受け入れるconst struct sockaddr *ので、正しいコードです。

于 2013-01-09T22:01:58.677 に答える
0
// This declares a variable of type "struct sockaddr"
struct sockaddr echoServAddr;

// This merely takes a pointer to your structure,
// It (redundantly) casts that pointer to "struct sockaddr *" 
struct sockaddr *myPtr = (struct sockaddr *) &echoServAddr;

// This calls the function "bind()" and passes it a pointer to your structure
if (bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) {
    perror("bind() failed");
    exit(1);
} 

PS: はい、ある構造体型のポインターを別の構造体型のポインターにキャストできます。

そして、基礎となる構造体が実際に互換性がない限り、そうすることはあなたを非常に悲しくさせる可能性があります:)

于 2013-01-09T22:18:33.340 に答える